为什么 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实例化私有变量some​​value的值,所以在你的例子。当 somevalue 更改时它不会更改。

getter

myService.getvalue()

return是当前时刻私有变量some​​value的值,所以会随着不同的控制器更新值而变化。

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 具有的任何值,在本例中为 2theValuesomevalue 之间没有任何联系。因为你永远不会改变 theValue 它总是 2.

此外,myServiceApi 只有 一个 个实例。所有控制器都使用相同的实例。