我正在使用Angularjs和Coffeescript构建一个简单的Appgyver移动应用程序 - 我是这两个的初学者。
我希望确定数据库中存储的最多20个项目列表的总成本。但是,可能会少于20个项目。
我尝试使用ng-bind进行计算,只要所有字符串都包含值,它就能完美运行。但是,如果少于20对(值达到q20和p20),则计算返回NaN。
我想确定列表中所有现有值的总和。我已经查看了stackoverflow,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()
)
答案 0 :(得分:0)
请不要滥用ng-bind
进行计算!而是计算控制器中的值并绑定结果值。
您的代码存在问题 - 如果任何值不是数字,则结果变为NaN
。在控制器功能中,检查是否存在值,然后运行。您可能想要检查该值是否为非空以及数字字符串,然后对其进行操作。
答案 1 :(得分:0)
我认为你正在超载(在语言学意义上,而不是编码意义上)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();
只需随时在控制器中拨打setTotalPrice
或ng-click
。