如果一个值是空字符串,则无法对 Angularjs 中的值求和
Can't sum values in Angularjs if one value is an empty string
我正在使用 Angularjs 和 Coffeescript 构建一个简单的 Appgyver 移动应用程序 - 我是这两者的初学者。
我想确定存储在数据库中的最多 20 项列表的总成本。但是,可能少于 20 项。
我尝试使用 ng-bind 进行计算,只要所有字符串都包含值,它就可以完美运行。但是,如果少于 20 对(值上升到 q20 和 p20),则计算 returns NaN。
我想确定列表中所有现有值的总和。我查看了 Whosebug、Angularjs.org 和其他网站上的大量示例,并尝试了无数种替代方法,但我认为我对如何使这项工作缺乏基本的了解。任何帮助将不胜感激。
这是我用过的代码,缩短为 3 对而不是 20 对:
<span ng-bind="client['q1'].price * client['p1'].price + client['q2'].price
* client['p2'].price + client['q3'].price * client['p3'].price"></span>
这是现有的控制器:
angular
.module('client')
.controller("ShowController", ($scope, Client, supersonic) ->
$scope.client = 0;
$scope.showSpinner = true
$scope.dataId = undefined
_refreshViewData = ->
Client.find($scope.dataId).then (client) ->
$scope.$apply ->
$scope.client = client
$scope.showSpinner = false
supersonic.ui.views.current.whenVisible ->
_refreshViewData() if $scope.dataId
supersonic.ui.views.current.params.onValue (values) ->
$scope.dataId = values.id
_refreshViewData()
$scope.remove = (id) ->
$scope.showSpinner = true
$scope.client.delete().then ->
supersonic.ui.layers.pop()
)
请不要滥用ng-bind
进行计算!而是计算控制器中的值并绑定结果值。
您的代码存在问题 - 如果任何值不是数字,您的结果将变为 NaN
。在控制器功能中,您检查值是否存在,然后进行操作。您可能想检查该值是否为非空以及数字字符串,然后对其进行操作。
我认为你超载了(在语言意义上,而不是编码意义上)ng-bind
。在您的 HTML 中执行所有这些代码是混乱的,而不是创建它的目的。您最好在控制器中进行数学运算,然后在 ng-bind 中引用它。你这里只有 3 对,但你说你有 20 对,而且可能更多,所以就这样做:
<span ng-bind="totalPrice"></span>
在你的控制器中:
var setTotalPrice = function() {
var ret = 0, i, maxClient = 6, client = $scope.client; // or however else you keep track of them
for (i=1;i<=maxClient;i++) {
if (client['q'+i] && client['q'+i].price && !isNaN(client['q'+i].price) &&
client['p'+i] && client['p'+i].price && !isNaN(client['p'+i].price)) {
ret += (client['q'+i].price * client['p'+i].price);
}
}
$scope.totalPrice = ret;
};
$scope.setTotalPrice = setTotalPrice;
setTotalPrice();
只需在您的控制器中或在 ng-click
上调用 setTotalPrice
。
我正在使用 Angularjs 和 Coffeescript 构建一个简单的 Appgyver 移动应用程序 - 我是这两者的初学者。
我想确定存储在数据库中的最多 20 项列表的总成本。但是,可能少于 20 项。
我尝试使用 ng-bind 进行计算,只要所有字符串都包含值,它就可以完美运行。但是,如果少于 20 对(值上升到 q20 和 p20),则计算 returns NaN。
我想确定列表中所有现有值的总和。我查看了 Whosebug、Angularjs.org 和其他网站上的大量示例,并尝试了无数种替代方法,但我认为我对如何使这项工作缺乏基本的了解。任何帮助将不胜感激。
这是我用过的代码,缩短为 3 对而不是 20 对:
<span ng-bind="client['q1'].price * client['p1'].price + client['q2'].price
* client['p2'].price + client['q3'].price * client['p3'].price"></span>
这是现有的控制器:
angular
.module('client')
.controller("ShowController", ($scope, Client, supersonic) ->
$scope.client = 0;
$scope.showSpinner = true
$scope.dataId = undefined
_refreshViewData = ->
Client.find($scope.dataId).then (client) ->
$scope.$apply ->
$scope.client = client
$scope.showSpinner = false
supersonic.ui.views.current.whenVisible ->
_refreshViewData() if $scope.dataId
supersonic.ui.views.current.params.onValue (values) ->
$scope.dataId = values.id
_refreshViewData()
$scope.remove = (id) ->
$scope.showSpinner = true
$scope.client.delete().then ->
supersonic.ui.layers.pop()
)
请不要滥用ng-bind
进行计算!而是计算控制器中的值并绑定结果值。
您的代码存在问题 - 如果任何值不是数字,您的结果将变为 NaN
。在控制器功能中,您检查值是否存在,然后进行操作。您可能想检查该值是否为非空以及数字字符串,然后对其进行操作。
我认为你超载了(在语言意义上,而不是编码意义上)ng-bind
。在您的 HTML 中执行所有这些代码是混乱的,而不是创建它的目的。您最好在控制器中进行数学运算,然后在 ng-bind 中引用它。你这里只有 3 对,但你说你有 20 对,而且可能更多,所以就这样做:
<span ng-bind="totalPrice"></span>
在你的控制器中:
var setTotalPrice = function() {
var ret = 0, i, maxClient = 6, client = $scope.client; // or however else you keep track of them
for (i=1;i<=maxClient;i++) {
if (client['q'+i] && client['q'+i].price && !isNaN(client['q'+i].price) &&
client['p'+i] && client['p'+i].price && !isNaN(client['p'+i].price)) {
ret += (client['q'+i].price * client['p'+i].price);
}
}
$scope.totalPrice = ret;
};
$scope.setTotalPrice = setTotalPrice;
setTotalPrice();
只需在您的控制器中或在 ng-click
上调用 setTotalPrice
。