【问题标题】:AngularJS factory inject other factories possible?AngularJS工厂注入其他工厂可能吗?
【发布时间】:2015-02-19 18:40:53
【问题描述】:

这是我拥有的 3 个角工厂:

angular.module('myApp', []); 

angular.module('myApp').factory('**ClassA**', function() {
    return {
        object: {"id":-1, "name": "abc"}
    };
});


angular.module('myApp').factory('**ClassB**', function() {
    return {
        object : {"city":"cc","state":"NJ"} 
          };
});


angular.module('myApp').factory('**ClassAB**', function() {
    return {
        object:{ 
            ClassA: {"id":-1, "name":"pqr"},
            ClassB: {"city":"aa", "state":"NY"}
        }
    };
});

有没有办法包含或引用 ClassA 和 ClassB,这样我就不必再次复制代码了。像这样不会将数据传回 ClassA 或 ClassB 的东西。

angular.module('myApp').factory('**ClassAB**', function(ClassA, ClassB){
    return {
        object:{ 
            "ClassA": ClassA.object,
            "ClassB": ClassB.object
        }
    };
});

当我说:

angular.module('myApp').controller('MyController', function($scope, $filter, ClassA, ClassB, ClassAB) {

    console.log("ClassA before:" +ClassA.object.name);
    ClassAB.object.classA.name="xyz";
    console.log("ClassAB :"ClassAB.object.ClassA.name);
    console.log("ClassA after:"ClassA.object.name);
}

我明白了:

ClassA before: abc 

ClassAB : xyz

ClassA after: xyz

我希望看到这样的东西:

ClassA before: abc

ClassAB : xyz

ClassA after: abc

【问题讨论】:

    标签: angularjs dependency-injection factory


    【解决方案1】:

    服务和工厂在 Angularjs 中是单例的,它们是通过引用传递的。

    所以,如果您不想更改 ClassA 对象,只需复制它们然后修改它们。

    angular.module('myApp').controller('MyController', function($scope, $filter, ClassA, ClassB, ClassAB) {
    
        console.log("ClassA before:" +ClassA.object.name);
        var obj = ClassAB.object.classA.copy();
            obj.name = "xyz";
        //use temp_name as you want 
        console.log("ClassAB :"ClassAB.object.ClassA.name);
        console.log("ClassA after:"ClassA.object.name);
    }
    

    这会给你

    ClassA before: abc
    
    ClassAB : xyz
    
    ClassA after: abc
    

    【讨论】:

    • 太棒了。感谢您的提示,我实际上尝试在工厂制作副本,这样控制器就不必担心它......使它更清洁并完成相同的操作。 'angular.module('myApp').factory('ClassAB', function(ClassA, ClassB){ return { object:{ "ClassA": angular.copy(ClassA.object), "ClassB ": angular.copy(ClassB.object) } }; });'
    【解决方案2】:

    我想您需要更仔细地选择从您的工厂公开暴露的内容。也许使用 setter 和 getter 而不是直接暴露对象,因为它是一个单例。看来你想要的ClassAClassB 都是ClassAB 的起始值。也许这种方法更适合您:

    工厂

    angular.module('myApp', []); 
    
    angular.module('myApp').factory('ClassA', function() {
        // "private" variable
        var defaults = {"id":-1, "name": "abc"};
    
        return {
            get: function(){return defaults;},
            set: function(obj){defaults = obj;}
        };
    });
    
    
    angular.module('myApp').factory('ClassB', function() {
        var defaults = {"city":"cc","state":"NJ"};
        return {
            get: function(){return defaults;},
            set: function(obj){defaults = obj;}
        };
    });
    
    
    angular.module('myApp').factory('ClassAB', function(ClassA,ClassB) {
        return {
            object:{ 
                ClassA: ClassA.get(),
                ClassB: ClassB.get()
            }
        };
    });
    

    控制器

    angular.module('myApp').controller('MyController', function($scope, $filter, ClassA, ClassB, ClassAB) {

    console.log("ClassA before:" +ClassA.get().name); // abc
    ClassAB.object.classA.name="xyz";
    console.log("ClassAB :"ClassAB.object.ClassA.name); // xyz
    console.log("ClassA after:"ClassA.get().name); // abc
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 2014-05-08
      相关资源
      最近更新 更多