Почему поля "приватного" сервиса 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); };