2015-02-19 2 views
0

Вот 3 угловые фабрики у меня есть:Завод AngularJS может вводить другие фабрики?

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 
     } 
    }; 
}); 

Я не хочу данных, которые будут связаны с класса А или В только опорный класс т.е. в контроллере, когда я говорю:

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 

ответ

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 
+0

Awesome. Спасибо за подсказку, я на самом деле попытался сделать копию на заводе, чтобы диспетчер не беспокоился об этом ... делает его намного чище и выполняет то же самое. «angular.module (« myApp »). factory ('** ClassAB **', функция (ClassA, ClassB) { return { объект: { " ClassA ": угловое копирование (ClassA.object), " ClassB ": angular.copy (ClassB.object) } }; }); ' –

0

Я думаю, вам нужно более тщательно выбирать то, что подвергается публично от вашего завода. Возможно, используйте сеттеры и геттеры вместо того, чтобы подвергать объект напрямую, поскольку он является одноэлементным. Кажется, что все, что вы хотите от ClassA и ClassB, начинаются с 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') контроллера ('MyController', функция ($ области видимости,. $ фильтр, 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 

}