我试图将数据从一个控制器发送到另一个控制器,但没有成功。我已经尝试了使用 Angular 服务在 Stack Overflow 上找到的所有想法,但我看不出我的代码有什么问题。
我有一个列出一些项目的第一个控制器(CartSidebarCtrl)。它还具有从列表中删除项目的能力。
我有另一个控制器应该显示项目数(TopCartCtrl)。
在页面加载时,第二个控制器显示正确数量的项目。但是当我删除第一个控制器中的一些项目时,第二个没有更新。
我在这里做错了什么?
HTML 代码:
<div ng-controller="CartSidebarCtrl">
<ul>
<li ng-repeat="product in products">
{{product.name}} (<span style="color: blue; cursor: pointer" ng-click="remove($index)">Remove</span>)
</li>
</ul>
</div>
<div ng-controller="TopCartCtrl">
<span>{{topCartText}}</span>
</div>
角代码:
magentoApp.factory('cartModel', function () {
var cartModel = {};
cartModel.updateProducts = function(products) {
cartModel.products = products;
};
return cartModel;
});
magentoApp.controller('CartSidebarCtrl', ['$scope', '$http', 'cartModel', function($scope, $http, cartModel) {
$scope.products = [
{ name: 'Product 1' },
{ name: 'Product 2' }
];
$scope.remove = function($index) {
$scope.products.splice($index, 1);
updateTopCart();
}
updateTopCart = function() {
cartModel.updateProducts($scope.products);
}
updateTopCart();
}]);
magentoApp.controller('TopCartCtrl', ['$scope', 'cartModel', function($scope, cartModel) {
$scope.topCartText = cartModel.products.length;
}]);
[使用更新的代码进行编辑]
除了“m59”和“Jesus Rodriguez”提到的对象引用不正确这一事实之外,我还在cartModel.products 上要求.length。出于同样的原因,我的模板没有更新。然后我的解决方案是将产品对象传递给模板并在此模板上调用 .length 。然后,我想根据 products.length 显示不同的文本,并通过创建自定义过滤器来完成这项工作。
这是正确的代码。
HTML:
<div ng-controller="TopCartCtrl">
<span>{{products.length | topCartFilter}}</span>
</div>
<div ng-controller="CartSidebarCtrl">
<ul>
<li ng-repeat="product in products">
{{product.name}} (<span style="color: blue; cursor: pointer" ng-click="remove($index)">Remove</span>)
</li>
</ul>
</div>
角度:
magentoApp.factory('cartModel', function() {
var cartModel = {
products: [
{ name: 'Product 1' },
{ name: 'Product 2' }
]
};
return cartModel;
});
magentoApp.filter('topCartFilter', function() {
return function(productsCount) {
return (productsCount > 0) ? 'You have ' + productsCount + ' items in your cart': 'Your cart is empty';
};
});
magentoApp.controller('TopCartCtrl', ['$scope', 'cartModel', function($scope, cartModel) {
$scope.products = cartModel.products;
}]);
magentoApp.controller('CartSidebarCtrl', ['$scope', 'cartModel', function($scope, cartModel) {
$scope.products = cartModel.products;
$scope.remove = function($index) {
$scope.products.splice($index, 1);
}
}]);