javascript 使用 angularJS 参数从 div 调用函数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/29863382/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 11:12:55  来源:igfitidea点击:

Invoke function from div with angularJS parameter

javascriptangularjs

提问by blue-sky

Below I'm attempting to convert millisecond to javascript date :

下面我试图将毫秒转换为 javascript 日期:

<div ng-app>
  <div ng-controller="TodoCtrl">
    <div>
        <script type="text/javascript">
            parseDate({{test}})
        </script>
      </div>
  </div>
</div>

function TodoCtrl($scope) {
  $scope.test = "1429831430363"
}

function parseDate(date) {
    var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

    return months[date.getUTCMonth()] + ' ' + date.getUTCDate();
}

http://jsfiddle.net/U3pVM/15141/

http://jsfiddle.net/U3pVM/15141/

But error Uncaught SyntaxError: Unexpected token {is thrown on console.

但是Uncaught SyntaxError: Unexpected token {在控制台上抛出错误。

What is correct method of invoking function from div with angularJS parameter ?

从带有 angularJS 参数的 div 调用函数的正确方法是什么?

采纳答案by Mukund Kumar

use this code : see fiddle

使用此代码:见小提琴

<div ng-app>
  <div ng-controller="TodoCtrl">
    <div>
      {{parseDate(test)}}
      </div>
  </div>
</div>


function TodoCtrl($scope) {
  $scope.test = "1429831430363"

    $scope.parseDate=function(date) {
    var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

    return months[(new Date()).getUTCMonth()] + ' ' + (new Date()).getUTCDate();
   }
}

回答by manzapanza

A more elegant solution to format a date is creating a custom filter because is more clean and you can re-use it everywhere:

格式化日期的更优雅的解决方案是创建自定义过滤器,因为它更干净,您可以在任何地方重复使用它:

Filter:

筛选:

myApp.filter('myMillisecondsToUTCDate', [function() {
    return function(milliseconds) {
        var date = new Date(milliseconds);
        var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                      'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
        return months[date.getUTCMonth()] + ' ' + date.getUTCDate();
    };
}]);

Controller:

控制器:

myApp.controller('MyCtrl', function($scope, $filter) {
    $scope.testDate = 1429831430363;   
    // Re-Use the filter everywhere
    $scope.formattedDate = $filter('myMillisecondsToUTCDate')($scope.testDate);
});

Html:

网址:

<div ng-controller="MyCtrl">
    Format a date using a custom filter: {{testDate | myMillisecondsToUTCDate}}<br/>
    Formatted date {{formattedDate}}
</div>

Check the demo fiddle

检查演示小提琴

回答by Kop4lyf

Modififying your code:

修改你的代码:

  1. We dont need script inside divs as they are still evaluated seperately.

  2. defined parseDate inside angularjs controller, If this is really general, define it as a service/factory and use it everywhere. That is the angular way.

  3. Your test is a string. It doesnot have getUTCMonth function, it should be a number so that it can be converted to a date so that we can use the above function.

  1. 我们不需要 div 中的脚本,因为它们仍然是单独评估的。

  2. 在 angularjs 控制器中定义了 parseDate,如果这真的很通用,请将其定义为服务/工厂并在任何地方使用它。这就是角度方式。

  3. 你的测试是一个字符串。它没有 getUTCMonth 函数,它应该是一个数字,以便可以将其转换为日期,以便我们可以使用上述函数。

following is the modified code, which works:

以下是修改后的代码,它有效:

    <div ng-app>
  <div ng-controller="TodoCtrl">
    <div>
            {{parseDate(test)}}
      </div>
  </div>
</div>

And the controller:

和控制器:

function TodoCtrl($scope) {
  $scope.test = 1429831430363;
  $scope.parseDate = function(date) {
  var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  date = new Date(date);
  return months[date.getUTCMonth()] + ' ' + date.getUTCDate();
}
}

See this fiddle: http://jsfiddle.net/U3pVM/15146/

看到这个小提琴:http: //jsfiddle.net/U3pVM/15146/

回答by Iso

You can use angular.elementand jqLite.scopeto get the scope object. Remember that angular and your app need to be initialized for this to work, so you'd better call parseDatein a callback.

您可以使用angular.elementjqLite.scope来获取范围对象。请记住,需要初始化 angular 和您的应用程序才能使其工作,因此您最好调用parseDate回调。

parseDate(
  angular
    .element('[ng-controller="TodoCtrl"]') // but you'd rather give it an ID / class name / whatever
    .scope()
    .test
);