为什么在HTML Angular中使用Math.floor时没有返回任何值?

8

这是我的HTML代码:

<div ng-controller = "myCntrl">  
    <pre>floor 1: {{Math.floor( value )  }}</pre>  
    <pre>floor 2: {{value }}</pre>  
    <pre>floor 3: {{value | number : 0 }}</pre>  
    <pre>floor 1 from controller: {{newValue }}</pre>  
</div>

控制器

app.controller('myCntrl', function ($scope) {
    $scope.value = 1233.8435;
    $scope.newValue = Math.floor(1233.8435);    
});

输出结果:
floor 1: 
floor 2: 1233.8435
floor 3: 1,234
floor 1 from controller: 1233

通常我正在寻找正确的方法来获取1233

我不想在控制器中调用新方法。

为什么Math.floor返回空?

谢谢,

演示


$scope.Math.floor 是什么? - Sergiu Paraschiv
Math.floor 指的是 JavaScript。 - snaggs
此外,https://dev59.com/EGcs5IYBdhLWcg3wk06X - Sergiu Paraschiv
这个内容实际上应该包含在Angular文档中:"表达式不是JavaScript eval。请查看以下示例..." - Kos Prov
实际上,它是这样的:“可能会让人想到Angular视图表达式是JavaScript表达式,但这并不完全正确,因为Angular不使用JavaScript eval()来评估表达式。”(http://docs.angularjs.org/guide/expression) - Sergiu Paraschiv
你说得对。我只是想说他们应该在其中包含这个例子。:P - Kos Prov
4个回答

20
在这种情况下,AngularJS <span>{{value}}</span> (表达式) 是 <span ng-bind="value"></span> 的简写,而 ng-bind 作用于当前的 scope
你当前的$scope是由 myCntrl 定义的,所以 ng-bind="value" 被评估为 $scope.value
在AngularJS中,没有办法区分全局的 Math 命名空间和 $scope.Math,因此它会像对待其他作用域表达式一样处理它。
我建议不要使用 $scope.Math=Math;
正确的做法是使用过滤器
angular.module('myApp',[]).filter('floor', function(){

    return function(n){
        return Math.floor(n);
    };
});

1
也许你可以跳过包装函数,直接返回 Math.floor; - Kos Prov
使用Angular的方式+1。这个答案比被接受的答案好多了。 - brcpar

13

表达式会在$scope上进行求值。如果您在控制器中执行以下操作:

$scope.Math=Math;

它将起作用。


1
把它放在你的控制器中。
<div ng-controller = "myCntrl">  
  <pre>floor 1: {{Mathvalue}}</pre>  
  <pre>floor 2: {{value }}</pre>  
  <pre>floor 3: {{value | number : 0 }}</pre>  
</div>

var app = angular.module('myModule', []);

app.controller('myCntrl', function ($scope) {
  $scope.value = 1233.8435; 
  $scope.Mathvalue = Math.floor(1233.8435);
});

app.$inject = ['$scope'];

0

Angular表达式不支持所有的JavaScript方法,例如Math.floor(),您可以在$scope上声明一个floor函数并委托Meth floor。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接