如果一个值是空字符串,则无法对Angularjs中的值求和

时间:2015-03-12 07:28:52

标签: angularjs coffeescript steroids

我正在使用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()
  )

2 个答案:

答案 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();

只需随时在控制器中拨打setTotalPriceng-click