将输入绑定到Angular控制器功能

嘘声

我有一个购物车,其中显示了风味的名称和数量,然后显示每种风味的总价。然后,在所有样式的底部,我都对整个购物车进行了计算。

HTML:

<div ng-repeat="flavor in cart track by $index">
 <div>
   <span class="flavor-name no-margin">{{flavor.name}} x <input type="text" name="{{flavor.name}}" size="1" ng-model="flavor.quantity"></span>
   <span class="flavor-price no-margin">{{flavor.price * flavor.quantity | currency }}</span>
   <div class="clearfix"></div>
   </div>
</div>

<div ng-if="cart.length > 0">
  <span class="cart-total-text no-margin">Total:</span>
  <span class="cart-total no-margin">{{ total | currency}}</span>
  <div class='clearfix'></div>
</div>

在我的控制器中:

function total() {
   var total = 0;
   for (var i = 0; i < $scope.cart.length; i++) {
     var add = $scope.cart[i].price * $scope.cart[i].quantity;
     total = total + add;
   }

  return total;
}

$scope.$watchCollection("cart", function() {
  $scope.total = total();
});

我的购物车看起来像这样:{'name':'Strawberry','price':4.5,'quantity':0,},{'name':'Mint','price':3.5,'quantity':0 , }, 等等

现在,当我向购物车中添加新东西时,总数量是有效的,但是当我在输入框中更改风味的数量时,如何使角度“倾听”呢?谢谢!

克里斯多夫·L

您应该能够将total()函数放在作用域上并将其绑定到范围:

在HTML中:

<span class="cart-total no-margin">{{total() | currency}}</span>

在控制器中:

$scope.total = function() {
    var total = 0;
    for (var i = 0; i < $scope.cart.length; i++) {
        var add = $scope.cart[i].price * $scope.cart[i].quantity;
        total = total + add;
    }
    return total;
}

每当变化(例如数量)变化时,Angular应触发摘要循环并重新评估所有绑定的表达式,包括total()方法。

IMO这是最简单的方法。如果您真的想使用$ watch路线(或了解为什么当前代码无法正常工作),则必须了解Angular如何“监视”对象。

  • $scope.$watch默认情况下,仅在对象引用发生更改时才会触发

  • $scope.$watchCollection再往前走一点,并在从集合添加或删除元素时触发(即使集合引用保持不变)。

就您而言,更改风味的数量不会添加或删除集合中的项目,这就是为什么不会触发代码的原因。

您真正想要的是对购物车对象的“深入观察”。这可以通过将第三个参数传递给$watch方法(称为的布尔值objectEquality)来实现:

$scope.$watch("cart", function() {
    $scope.total = total();
}, true); // Tells Angular to test object equality.

这将使Angular寻找受监视对象(而不仅仅是引用)的属性发生变化,当flavor.quantity更改时,该属性将触发。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将控制器功能绑定到ui路由器ui-href

将服务绑定到云功能时错误的资源控制器 URL

将搜索输入绑定到不同控制器中的ng-repeat

将Angular元素绑定到控制器外部的作用域

无法将数据从控制器正确绑定到自定义指令模板Angular

角度:将状态注入控制器(或将“模型”绑定到控制器)

在重定向之前将数据从控制器功能传递到控制器功能

Angular绑定控制器到新范围

将控制器对象绑定到ember中的组件

将表单参数从JSP绑定到spring控制器

将控制器$ scope绑定到服务中的对象

将变量绑定到控制器内部的模型

将工厂数据绑定到angularjs控制器

FXML:将TableViews项目属性绑定到控制器

将模板中的数组从模板绑定到控制器

将嵌套类列表从视图绑定到控制器

Laravel 4 将输入从刀片传递到控制器

FXML:绑定到控制器

控制器未绑定到视图

ASP.Net MVC动态输入绑定到相同的控制器属性

如何将一个控制器的不同作用域绑定到一个控制器?

控制器内部的Angular 1.6绑定

将多个值绑定到单个复选框,并将其发布到控制器

如何将复选框与控制器中的不同功能绑定?

从视图到控制器将Jquery数据表中的所有数据绑定

将DropdownList属性绑定到ASP.NET Core中的控制器方法

无法将基于Thymeleaf的UI表单中的值绑定到Spring Boot中的控制器

将变量作为vm绑定到指令范围,而没有该指令的控制器?

将ngmodel绑定到从Java控制器接收到的值