在Angular JS中的控制器之间传递数据?
我有一个基本的控制器来显示我的产品,
App.controller('ProductCtrl',function($scope,$productFactory){
$productFactory.get().success(function(data){
$scope.products = data;
});
});
在我看来,我在列表中显示这些产品
<ul>
<li ng-repeat="product as products">
{{product.name}}
</li>
</ul
我试图做的是当有人点击产品名称时,我有另一个名为购物车的视图,添加了该产品。
<ul class="cart">
<li>
//click one added here
</li>
<li>
//click two added here
</li>
</ul>
所以我的疑问是,如何将这个点击的产品从第一个控制器传递到第二个控制器? 我认为购物车也应该是一个控制器。
我使用指令处理单击事件。 另外我觉得我应该使用服务来实现上述功能只是无法计算出如何? 因为购物车将预定义的产品数量可能是5/10,具体取决于用户是哪个网页。 所以我想保留这个通用名称。
更新:
我创建了一个服务来广播,并在第二个控制器中收到它。 现在查询是如何更新dom? 由于我的产品清单非常硬编码。
从描述中,似乎你应该使用服务。 查看http://egghead.io/lessons/angularjs-sharing-data-between-controllers和AngularJS服务在控制器之间传递数据以查看一些示例。
你可以这样定义你的产品服务:
app.service('productService', function() {
var productList = [];
var addProduct = function(newObj) {
productList.push(newObj);
};
var getProducts = function(){
return productList;
};
return {
addProduct: addProduct,
getProducts: getProducts
};
});
依赖注入服务到两个控制器。
在您的ProductController
,定义一些将所选对象添加到数组的操作:
app.controller('ProductController', function($scope, productService) {
$scope.callToAddToProductList = function(currObj){
productService.addProduct(currObj);
};
});
在您的CartController
,从服务中获取产品:
app.controller('CartController', function($scope, productService) {
$scope.products = productService.getProducts();
});
如何将这个点击的产品从第一个控制器传递到第二个?
点击可以调用调用广播的方法:
$rootScope.$broadcast('SOME_TAG', 'your value');
第二个控制器会听这个标签,如:
$scope.$on('SOME_TAG', function(response) {
// ....
})
由于我们无法将$ scope注入到服务中,因此没有任何东西像$ single作用域。
但是我们可以注入$rootScope
。 因此,如果您将值存储到服务中,则可以运行$rootScope.$broadcast('SOME_TAG', 'your value');
在服务机构。 (请参阅有关服务的@Charx描述)
app.service('productService', function($rootScope) {/*....*/}
请检查关于 $广播,$发射的好文章
解决方案无需创建服务,使用$ rootScope:
要跨应用程序控制器共享属性,您可以使用Angular $ rootScope。 这是分享数据的另一种选择,让人们知道它。
跨控制器共享某些功能的首选方法是Services,以读取或更改全局属性,您可以使用$ rootcope。
var app = angular.module('mymodule',[]);
app.controller('Ctrl1', ['$scope','$rootScope',
function($scope, $rootScope) {
$rootScope.showBanner = true;
}]);
app.controller('Ctrl2', ['$scope','$rootScope',
function($scope, $rootScope) {
$rootScope.showBanner = false;
}]);
在模板中使用$ rootScope(使用$ root的访问属性):
<div ng-controller="Ctrl1">
<div class="banner" ng-show="$root.showBanner"> </div>
</div>
链接地址: http://www.djcxy.com/p/13651.html