2015-04-26 3 views
2

Если я следую за эту конкретную практику изготовления заводов:Почему угловые сервисные «частные» поля не обновляются?

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/

Что происходит в фоновом режиме здесь?

+0

Посмотрите на следующее: http: // stackoverflow.com/questions/16023451/binding-variables-from-service-factory-to-controller –

+0

@jonnyknowsbest Да, я понимаю, что привязка переменных не работает, я просто не получал, пока новые инстанционные синглоты не получили обновленные поля , В любом случае спасибо. –

ответ

4

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

Вашей скрипка фактически не испытывая значение 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; 
    } 
}); 
+0

Теперь все очень очевидно, что вы упомянули об этом, не понимаете, как я пропустил это. Поэтому, если я изменю метод обновления на myService.theValue, это сработает, поскольку я думал, что это будет http://jsfiddle.net/IngoVals/hd1r1bmp/3/ –

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

Этот вопрос касается фабрики, а не контроллера –

+1

Что означает 'vs'? – azium

+0

'vs' означает ** Просмотр $ scope **. Также, если вы используете синтаксис 'Controller as', я бы использовал' vm = this'. 'vm' будет стоять за ** view model **. –

3

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

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

var somevalue = 2; 

var myServiceApi = { 
     theValue: somevalue, 

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

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

+0

. Хотя этот ответ правильный, а другой вы избили его почти 2 минуты. –

Смежные вопросы