Javascript Angularjs保留局部变量
我有一个这样的工厂:Javascript Angularjs保留局部变量,javascript,angularjs,Javascript,Angularjs,我有一个这样的工厂: TestFactory= function () { var objectName=null; return { SetName:function(name) { objectName = name; }, GetName:function() { return objectName; }, Init:function() {
TestFactory= function () {
var objectName=null;
return {
SetName:function(name) {
objectName = name;
},
GetName:function() {
return objectName;
},
Init:function() {
return angular.copy(this);
}
}
}
var tstA = new TestFactory();
var tstB = new TestFactory();
控制器,如:
TestController = function($scope) {
$scope.TestClick = function () {
var tstA = TestFactory.Init();
var tstB = TestFactory.Init();
tstA.SetName('test A')
tstB.SetName('test B')
console.log('A', tstA.GetName());
console.log('B', tstB.GetName());
}
}
在控制台中,我得到两个对象的测试B
我怎样才能为这个对象创建一个合适的实例
我想在工厂的其他函数中使用
objectName
值。考虑到在Angular中,工厂是单例的,因此实例总是相同的
您可以执行以下操作:
TestFactory= function () {
var objectName={};
return {
SetName:function(property,name) {
objectName[property] = name;
},
GetName:function(property) {
return objectName[property];
},
Clear:function(property) {
delete objectName[property]
}
}
}
然后在控制器中:
TestController = function($scope, TestFactory) {
$scope.TestClick = function () {
TestFactory.SetName('a','test A')
TestFactory.SetName('b','test B')
console.log('A', TestFactory.GetName('a')); // test A
console.log('B', TestFactory.GetName('b')); // test B
}
}
有几个问题。首先,从工厂返回对象而不是函数
app.factory('TestFactory', function() {
return function() {
var objectName = null;
var setName = function(name) {
objectName = name;
};
var getName = function() {
return objectName;
};
return {
SetName: setName,
GetName: getName
};
};
});
然后您可以这样实例化:
TestFactory= function () {
var objectName=null;
return {
SetName:function(name) {
objectName = name;
},
GetName:function() {
return objectName;
},
Init:function() {
return angular.copy(this);
}
}
}
var tstA = new TestFactory();
var tstB = new TestFactory();
服务和工厂是单例的,因此我认为您可以通过提供一个
Init
函数,返回公共代码和唯一名称,从而更恰当地使用工厂来实现您想要的功能,如下所示:
angular.module('app')
.factory('ServiceFactory', serviceFactory);
function serviceFactory() {
return {
Init: function (name) {
return {
objectName: name,
setName: function (name) {
this.objectName = name;
},
getName: function () {
return this.objectName;
}
};
}
};
}
这样就可以将它用作可以初始化许多类型的工厂。您基本上需要创建一个简单的getter/setter
angular.module('app',[])
.controller('TestController',TestController)
.服务(“服务工厂”,服务工厂);
testController.$inject=['serviceFactory'];
功能测试控制器(serviceFactory){
serviceFactory.set('A'{
名称:“测试A”
});
serviceFactory.set('B'{
名称:“测试B”
});
log(serviceFactory.getAll());
log(serviceFactory.get('A');
console.log(serviceFactory.get('B');
}
函数serviceFactory(){
变量
_型号={
姓名:“
},
_数据={};
返回{
设置:功能(键、数据){
_data[key]=angular.extend({},_model,data);
},
获取:函数(键){
返回_数据[键];
},
getAll:function(){
返回数据;
}
}
}
因此,我需要告诉每个后续函数,可以说,要观看的开关键可以工作,但对解决方案不满意:)我接受了这一点,因为它是最接近的。只是为了那些来这里的人。请想办法绕过这个要求。我最终将一个包含所有相关数据的对象传递到工厂的每个连续函数调用中,这样我就不需要进行上述操作了。因为这不是一种“有棱角的方式”