AngularJS 工厂注入其他工厂可能吗?
AngularJS factory inject other factories possible?
这是我拥有的 3 个 angular 工厂:
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
}
};
});
我不希望数据绑定到 Class A 或 B 只是 class 引用,即在控制器中,当我说:
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中是单例的,它们通过引用传递。
因此,如果您不想更改 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
我想你需要更仔细地选择你工厂公开暴露的内容。也许使用 setter 和 getter 而不是直接公开对象,因为它是一个单例。 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').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
}
这是我拥有的 3 个 angular 工厂:
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
}
};
});
我不希望数据绑定到 Class A 或 B 只是 class 引用,即在控制器中,当我说:
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中是单例的,它们通过引用传递。
因此,如果您不想更改 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
我想你需要更仔细地选择你工厂公开暴露的内容。也许使用 setter 和 getter 而不是直接公开对象,因为它是一个单例。 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').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
}