2015-09-19 2 views
0

TL; DR Как настроить в контроллере $watch на возвращаемое значение функции DI'ed?

У моего приложения есть сервис, позволяющий легко обмениваться данными между контроллерами. Я пытаюсь настроить $watch на одну из этих переменных с контроллера. Тем не менее, я хотел получить доступ через getter службы для этой конкретной переменной.

Это код в контроллере

//this is the controller 
    var vm = this; 
    vm.isValidPhase = false; 

    activate(); 

    //////////////// 

    function activate() { 
     vm.isValidPhase = userProgressService.getCurrentPhaseValidity(); 

     $scope.$watch('userProgressService.getCurrentPhaseValidity()', 
        function(newValue) { 
      vm.isValidPhase = newValue; 
     }); 
    } 

И в userProgressService у меня есть:

//this is the service 
    var current = { 
     phaseNumber : 0, 
     phaseValidity : false, 
     phase : {}, 
     userInput : {} 
    }; 

    // ... ... ... 

    var exports = { 
     getCurrentPhaseData : getCurrentPhaseData, 
     getCurrentPhaseValidity : getCurrentPhaseValidity, 
     setCurrentPhaseValidity : setCurrentPhaseValidity, 
     getExistingUserInput : getExistingUserInput 
    }; 

    return exports; 

    // ... ... ... 

    function getCurrentPhaseValidity() { 
     return current.phaseValidity; 
    } 

    // ... ... ... 

В моих модульных тестов в контроллер с помощью мокко, барда, Chai и Sinon, я делаю:

describe('initial state', function() { 
    it('should be an invalid phase', function() { 
     expect(userProgressService.getCurrentPhaseValidity(), 
       'in service function').to.be.false; 
     expect(controller.isValidPhase, 
       'in controller scope').to.be.false; 
    }); 
}); 

И я получаю сообщение об ошибке на втором утверждении:

AssertionError: in controller scope: expected undefined to be false

Теперь играть с комментированием и раскомментировать, я заметил, что проблема исходит от $watch выражения в контроллере. Но я не знаю, в чем проблема с этим ... Что я делаю неправильно?

+0

Зачем использовать часы? Просто не сохраняйте результат в переменной. Вызовите метод обслуживания каждый раз, когда вам нужно значение. –

+0

В том случае, если я хочу этого, мне действительно нужно посмотреть значение. В принципе, я хочу изменить «доступность» кнопки на основе значения этой переменной – pavlag

+0

Итак, выставляем функцию службы в области (например, '$ scope.getCurrentPhaseValidity = userProgressService.getCurrentPhaseValidity;') и используйте '

ответ

0

Как вы можете видеть в комментариях @JBNizet отметил, что выражение $watch неверно, вместо этого я должен наблюдать за самой функцией, поскольку служба не определена в $scope. Тем не менее, он также дал понять, что, по крайней мере для этого случая, мне не нужно было устанавливать этот $watch. По его собственным словам

[...] выставить функцию обслуживания в объеме (т.е. $scope.getCurrentPhaseValidity = userProgressService.getCurrentPhaseValidity;), а также использовать <button ng-show="getCurrentPhaseValidity()">

Я сделал, как он сказал, и изменил масштаб контроллера для

//... controller ... 
vm.isValidPhase = userProgressService.getCurrentPhaseValidity; 

Теперь я могу использовать ng-show и так с isValidPhase в HTML под контроллером.

Как и ожидалось, он работал и соответствовал цели, для которой я хотел посмотреть переменную, которая должна была активировать/деактивировать кнопку на основе ее значения.

Для решения этого вопроса мы рассмотрим многие связанные с этим проблемы, связанные с этим.

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