Почему поля "приватного" сервиса angular не обновляются?


Если я буду следовать этой конкретной практике создания фабрик:

    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 2

3 ответа:

Как вы знаете, фабричные функции вызываются только один раз-angular вернет тот же объект для последующего использования фабрики в ваших контроллерах.

Ваша скрипка на самом деле не проверяет значение somevalue - она проверяет значение

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;
    }
});

someValue инициализируется только один раз и должным образом обновляется при вызове updateValue().

myServiceApi.theValue устанавливается один раз и никогда не меняется.

var somevalue = 2;

var myServiceApi = {
      theValue: somevalue,

Означает создать объект и задать свойству theValue то значение, которое имеет somevalue, в данном случае 2. Между theValue и somevalue нет никакой связи. И поскольку вы никогда не меняетесь theValue, это всегда 2.

Кроме того, существует только один экземпляр myServiceApi. Один и тот же экземпляр используется всеми контроллерами.

Проблема вот в чем 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);
};