AngularJS工厂注入其他工厂可能吗?

时间:2015-02-19 18:40:53

标签: angularjs dependency-injection factory

以下是我有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,以便我不必再次复制代码。像 NOT 这样的东西将数据传回ClassA或ClassB。

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

我不想将数据绑定到A类或B类只是类引用,即在Controller中我说:

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

2 个答案:

答案 0 :(得分:0)

服务和工厂是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

答案 1 :(得分:0)

我想您需要更仔细地选择工厂公开曝光的内容。也许使用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(&#39; myApp&#39;)。控制器(&#39; MyController&#39;,功能($ 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

}