2013-12-21 55 views
3

我在我的应用程序中有购物车组件。它住在一个控制器中。控制器被实例化为按需加载到页面的部分(菜单栏中的图标)。现在如何在AngularJS中干净地构建组件/结构逻辑

app.controller('CartCtrl', function($scope, $http, storage) { 
    $scope.options = { 
     freeShipmentFrom: 180, 
     shipmentCosts: 6 
     ... 
    }; 

    $scope.init = (function(){ ... }()); 

    $scope.addItem = function(){ ... }; 
    ... 
    // more methods 
    ... 
}); 

具有与本部分/控制器之外提供的功能,即使没有被加载到页面。我为此使用了指令,所以例如我有一个指令来添加项目并显示购物车中的项目数量。

<button add-to-cart="productId">Add to cart</button> 

你会怎样的结构/设计有关最佳实践这个组件?将“add-to-cart”-logic添加到指令中?在上述部分之外定义一个服务,并从部分的指令和控制器访问它。

期待阅读您的想法!

回答

3

在指令和控制器之间添加购物车逻辑的最佳实践是使用服务并将其注入到控制器和指令中。下面是关于如何访问来自一个服务的例子:

var module = angular.module('app', []) 
.controller('CartCtrl', function($scope, cartService){ 
    $scope.cartName = "My Cart"; 
    $scope.productId = 123; 
    $scope.addItem = function(productId){ 
    cartService.addProductId(productId); 
    }; 
})   
.factory('cartService', function(){ 
    var products = []; 
    return { 
    addProductId : function(productId){ 
     products.push(productId); 
    } 
    }; 
}) 
.directive('addToCart', function(cartService){ 
    function link($scope, element, attrs){ 
    $scope.$watch('productId', function(value){ 
     if(value){ 
     cartService.addProductId(value); 
     } 
    }); 

这里是一个链接:http://jsbin.com/IKadoYAK/4/edit

0

我已经回答了类似的问题。这个问题有2个部分。请参考第二部分,你会得到你的答案!

Spring MVC or Rest Services with spring + AngularJS

与Angular玩得开心!

+0

我的问题是更多的意思,如“在那里把逻辑从不同地区访问的应用程序?”而不是关于目录/文件结构。 – kernfrucht

1

参考AngularJS文档,状态应该通过服务共享。 http://docs.angularjs.org/guide/controller#using-controllers-correctly

操纵状态可以在指令或控制器中完成。你有选择,但我建议你只使用指令,如果真的需要DOM交互。如果情况并非如此,那就简单地使用控制器。

处理状态的服务必须注入到控制器/指令中,然后在加载部分时注入。