在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

上一篇: Passing data between controllers in Angular JS?

下一篇: How to create separate AngularJS controller files?