如果我遵循这种制造工厂的特殊做法:
myApp.factory('myService', function () {
var somevalue = 2;
var myServiceApi = {
theValue: somevalue,
updatevalue: updateValue
}
return myServiceApi;
function updateValue(newValue) {
somevalue = newValue;
}
});
每次注入服务时,somevalue
的值始终初始化为2,即使我之前使用UpdateValue方法更新了它。但是,如果我在值上使用getter方法,那么它将在服务的所有实例中更新。
http://jsfiddle.net/IngoVals/hd1r1bmp/
这里的背景是怎么回事?
答案 0 :(得分:5)
如您所知,工厂函数仅调用一次 - angular将返回相同的对象,以便在控制器中随后使用工厂。
你的小提琴实际上并没有测试某些值的价值 - 它正在测试
的价值myService.theValue
此属性将在实例化时返回私有变量somevalue 的值,因此它始终为" 2"在你的例子中。当某些值发生变化时,它不会被改变。
吸气剂
myService.getvalue()
返回当前时间私有变量somevalue的值,因此当不同的控制器更新值时,它会发生变化。
myApp.factory('myService', function () {
var somevalue = 2;
var myService = {
//equivalent to theValue: 2
theValue: somevalue,
updatevalue: updateValue,
getvalue: getValue
}
return myService;
function getValue() {
return somevalue;
}
function updateValue(newValue) {
somevalue = newValue;
}
});
答案 1 :(得分:3)
someValue
仅初始化一次,并在调用updateValue()
时正确更新。
myServiceApi.theValue
设置一次,永不改变。
var somevalue = 2;
var myServiceApi = {
theValue: somevalue,
表示创建一个对象并将属性theValue
设置为somevalue
具有的任何值,在本例中为2
。 theValue
和somevalue
之间没有任何关联。由于您永远不会更改theValue
,因此始终2
。
此外,只有一个 myServiceApi
的实例。所有控制器都使用相同的实例。
答案 2 :(得分:-1)
问题在于var somevalue = 2;
这是一个控制器变量,我相信你需要它来使它成为一个控制器$scope
变量:$scope.somevalue = 2;
这样它可以从其他控制器/服务等更新。
我喜欢写这样的$scope
个变量来减少字符并且更具可读性:
var vs = $scope;
vs.myVar = '',
vs.value = '',
vs.myBool = true,
vs.myArray = [];
vs.myFunc = function() {
console.log(vs.value);
};