为什么 angular 服务 "private" 字段不更新?
Why do angular service "private" fields not update?
如果我遵循这种制造工厂的特殊做法:
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/
这里的后台发生了什么?
问题是这个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);
};
如您所知,工厂函数只会被调用一次 - angular 将 return 相同的对象用于控制器中工厂的后续使用。
您的 fiddle 实际上并未测试 somevalue 的值 - 它正在测试
的值
myService.theValue
这个属性会return实例化私有变量somevalue的值,所以在你的例子。当 somevalue 更改时它不会更改。
getter
myService.getvalue()
return是当前时刻私有变量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;
}
});
someValue
仅初始化一次,并在调用 updateValue()
时正确更新。
myServiceApi.theValue
设置一次,永不更改。
var somevalue = 2;
var myServiceApi = {
theValue: somevalue,
表示创建一个对象并将 属性 theValue
设置为 somevalue
具有的任何值,在本例中为 2
。 theValue
和 somevalue
之间没有任何联系。因为你永远不会改变 theValue
它总是 2
.
此外,myServiceApi
只有 一个 个实例。所有控制器都使用相同的实例。
如果我遵循这种制造工厂的特殊做法:
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/
这里的后台发生了什么?
问题是这个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);
};
如您所知,工厂函数只会被调用一次 - angular 将 return 相同的对象用于控制器中工厂的后续使用。
您的 fiddle 实际上并未测试 somevalue 的值 - 它正在测试
的值myService.theValue
这个属性会return实例化私有变量somevalue的值,所以在你的例子。当 somevalue 更改时它不会更改。
getter
myService.getvalue()
return是当前时刻私有变量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;
}
});
someValue
仅初始化一次,并在调用 updateValue()
时正确更新。
myServiceApi.theValue
设置一次,永不更改。
var somevalue = 2;
var myServiceApi = {
theValue: somevalue,
表示创建一个对象并将 属性 theValue
设置为 somevalue
具有的任何值,在本例中为 2
。 theValue
和 somevalue
之间没有任何联系。因为你永远不会改变 theValue
它总是 2
.
此外,myServiceApi
只有 一个 个实例。所有控制器都使用相同的实例。