为什么角度服务“私有”字段不会更新?

时间:2015-04-26 16:56:28

标签: angularjs angular-services

如果我遵循这种制造工厂的特殊做法:

    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/

这里的背景是怎么回事?

3 个答案:

答案 0 :(得分:5)

如您所知,工厂函数仅调用一次 - angular将返回相同的对象,以便在控制器中随后使用工厂。

你的小提琴实际上并没有测试某些值的价值 - 它正在测试

的价值
myService.theValue

此属性将在实例化时返回私有变量some​​value 的值,因此它始终为" 2"在你的例子中。当某些值发生变化时,它不会被改变。

吸气剂

myService.getvalue()

返回当前时间私有变量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;
    }
});

答案 1 :(得分:3)

someValue仅初始化一次,并在调用updateValue()时正确更新。

myServiceApi.theValue设置一次,永不改变。

var somevalue = 2;

var myServiceApi = {
      theValue: somevalue,

表示创建一个对象并将属性theValue设置为somevalue具有的任何值,在本例中为2theValuesomevalue之间没有任何关联。由于您永远不会更改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);
};