AngularJS如何从控制器中取出功能并放入工厂

时间:2015-04-28 18:13:32

标签: angularjs

好的继续我对Angular工厂的理解。我试图从我膨胀的控制器中删除功能并放入工厂。我有一个“OrderFormController”,它包含整个应用程序的所有功能。我要做的是创建一个包含所有这些函数的工厂,并通过其视图控制器在特定视图中调用所需的函数。这是我在这个过程中的地方,但我无法让它发挥作用..

这是OrderFormController,它现在拥有所有函数

app.controller('OrderFormController', function($scope) {

$scope.toggleActive = function(s){
    s.active = !s.active;
    s.qty = 1;
};

$scope.add = function(s){
    if (s.active){
        s.qty+= 1;
    }
};

$scope.minus = function(s){
    if (s.qty != 1){
        s.qty-= 1;
    }
};

$scope.clearCart = function(){

    angular.forEach($scope.items.results, function(s){
        if (s.active){
            s.active = false;
            s.qty = 1;
        }
    });
    angular.forEach($scope.foods, function(s){
        if (s.active){
            s.active = false;
            s.qty = 1;
        }
    });
};

$scope.total = function(){

    var total = 0;
    var dtotal = 0;
    var ftotal = 0;

    angular.forEach($scope.items.results, function(s){
        if (s.active){
            dtotal+= s.qty * s.price;
        }
    });
    angular.forEach($scope.options.results, function(s){
        if (s.active){
            ftotal+= s.price;
        }
    });
    total = dtotal + ftotal;

    return total;
};

$scope.totalItems = function(){

    var totalItems = "";
    var dtotalItems = "";
    var ftotalItems = "";

    angular.forEach($scope.items.results, function(s){
        if (s.active){
            dtotalItems+= s.name+" $"+s.price+".00 Qty: "+s.qty+" , ";
        }
    });
    angular.forEach($scope.foods, function(s){
        if (s.active){
            ftotalItems+= s.name+" $"+s.price+".00 Qty: "+s.qty+" , ";
        }
    });
    totalItems = dtotalItems + ftotalItems;

    return totalItems;
};
});

这是我的工厂或至少是第一个功能

app.factory('OrderData', function() {
var OrderFactory = {};

OrderFactory.toggleActive = function(item){
    item.active = !item.active;
    item.qty = 1;
};

return OrderFactory;

});

这里是我试图调用此函数的MenuController

app.controller('MenuController', function($scope, OrderData) {

$scope.toggle = OrderFactory.toggleActive(item);

});

这是由

调用的
ng-click="toggle(item)"

任何帮助都会受到谴责......

2 个答案:

答案 0 :(得分:2)

将其设置为:

app.controller('MenuController', function($scope, OrderData) {

$scope.toggle = OrderData.toggleActive;

这使得.toggle函数与toggleActive函数相同。在您的示例中,它立即运行toggleActive函数。

旁注:你有OrderData和OrderFactory,它是哪一个?

答案 1 :(得分:2)

您的服务名为OrderData,但您使用的是未定义的OrderFactory变量来调用它。

顺便说一下,当你做

app.factory('OrderData', function() {
    ...

您正在定义名为OrderData的服务。工厂是创建并返回服务的匿名函数。 OrderData是服务

另请参阅Mathew's answer,了解如何在范围中公开服务方法。