Search code examples
javascriptangularjsangular-services

Passing data between controllers in Angular JS?


I have a basic controller that displays my products,

App.controller('ProductCtrl',function($scope,$productFactory){
     $productFactory.get().success(function(data){
           $scope.products = data;
     });
});

In my view I'm displaying this products in a list

<ul>
    <li ng-repeat="product as products">
        {{product.name}}
    </li>
</ul

What I'm trying to do is when someone click on the product name, i have another view named cart where this product is added.

 <ul class="cart">
      <li>
          //click one added here
      </li>
      <li>
          //click two added here
      </li>
 </ul>

So my doubt here is, how do pass this clicked products from first controller to second? i assumed that cart should be a controller too.

I handle click event using directive. Also i feel i should be using service to achieve above functionality just can't figure how? because cart will be predefined number of products added could be 5/10 depending on which page user is. So i would like to keep this generic.

Update:

I created a service to broadcast and in the second controller i receive it. Now the query is how do i update dom? Since my list to drop product is pretty hardcoded.


Solution

  • From the description, seems as though you should be using a service. Check out http://egghead.io/lessons/angularjs-sharing-data-between-controllers and AngularJS Service Passing Data Between Controllers to see some examples.

    You could define your product service (as a factory) as such:

    app.factory('productService', function() {
      var productList = [];
    
      var addProduct = function(newObj) {
          productList.push(newObj);
      };
    
      var getProducts = function(){
          return productList;
      };
    
      return {
        addProduct: addProduct,
        getProducts: getProducts
      };
    
    });
    

    Dependency inject the service into both controllers.

    In your ProductController, define some action that adds the selected object to the array:

    app.controller('ProductController', function($scope, productService) {
        $scope.callToAddToProductList = function(currObj){
            productService.addProduct(currObj);
        };
    });
    

    In your CartController, get the products from the service:

    app.controller('CartController', function($scope, productService) {
        $scope.products = productService.getProducts();
    });