Почему поля "приватного" сервиса 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 ответа:
Как вы знаете, фабричные функции вызываются только один раз-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); };