【问题标题】:Arithmetic addition (+) is not working in ng-bind算术加法 (+) 在 ng-bind 中不起作用
【发布时间】:2015-12-05 08:59:32
【问题描述】:

有一个对象有

objData.pendingCount = '2',objData.refundCount = '1',objData.saleCount = 43;

我表演了

<td ng-bind="(objData.pendingCount / objData.saleCount * 100).toFixed(2)"></td>

这工作正常,但当我这样做时

<td ng-bind="(objData.pendingCount +objData.refundCount)/ objData.saleCount * 100).toFixed(2)"></td>

这里 + 不是执行算术运算,而是连接。我怎样才能做到这一点?

【问题讨论】:

  • pendingCountrefundCount 都是字符串。尝试将两者都包装在Number()
  • refundCount,我想。它不在第一个表达式中。
  • 我试过 .. 即使我使用 parseInt() 也不起作用

标签: javascript angularjs ng-bind


【解决方案1】:

我假设这些值来自某种文本框(通过 ng-model)。如果是这样,解决此问题的最简单方法是在它们上设置 type='number',然后 Angular 将负责其余的工作!

<input ng-model="objData.pendingCount" type="number" />
...

另一种方法是简单地加上前缀 + 来强制进行数字转换,就像这样

<span ng-bind="((+objData.pendingCount + +objData.refundCount)/ objData.saleCount * 100).toFixed(2)"></span>

为什么不能使用 Number(...) 将字符串变成 Angular 表达式中的数字

使用Number 将字符串转换为数字将无法直接工作,因为(来自https://docs.angularjs.org/guide/expression

上下文:JavaScript 表达式针对全局进行评估 窗户。在 Angular 中,表达式是针对 scope 对象进行评估的。

所以如果你需要使用Number,你可以这样做

$scope.Number = $window.Number;

在你的控制器中使用它之前在你的表达式中。其他全局窗口属性也是如此。

【讨论】:

  • 我试过 $scope.Math = $window.Math;并执行 Math.parseInt() 不工作
  • 它不适用于(+objData.pendingCount + +objData.refundCount)/ objData.saleCount * 100).toFixed(2)?还是 $scope.Number 之一?
  • 使用+objData.... 不起作用,但使用(1 * objData....) 可以:jsfiddle.net/5qnvnebg
  • 这很奇怪(我正在尝试使用绑定到模型值的文本框 - 它在那里工作)。有趣的是--objData.pendingCount + --objData.refundCount 工作
  • @potatopeelings,它可能适用于实际的 JavaScript,但显然不适用于 Angular 表达式解析器。
【解决方案2】:

纠正你的表情:

<td ng-bind="(objData.pendingCount +objData.refundCount)/ (objData.saleCount * 100).toFixed(2)"></td>

缺少一个左括号

【讨论】:

  • 使用
  • 只是想指出,像这样进行计算并不是一个好习惯。使用控制器执行计算,然后在视图中获取计算值。
  • 是的@AminMohamedAjani,但来自上述问题的原始对象包含值字符串:objData.pendingCount = '2',objData.refundCount = '1'...但我同意你的代码。
  • 我添加了 +$scope.blahblah 以将其强制为数字。我几乎忘记了那个小技巧,直到土豆皮皮在他的回答中提到它大声笑
  • 优秀...我以前不知道这个技巧...这个和双感叹号 (!!) 对我来说是 2015 年的顶级技巧
【解决方案3】:

我用

解决了
<td ng-bind="(sum(objData.pendingCount,objData.refundCount)/objData.saleCount*100).toFixed(2)"></td>

在控制器中

$scope.sum = function (a, b) {
   return parseInt(a) + parseInt(b);
}

它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2014-02-17
    相关资源
    最近更新 更多