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
выражения в контроллере. Но я не знаю, в чем проблема с этим ... Что я делаю неправильно?
Зачем использовать часы? Просто не сохраняйте результат в переменной. Вызовите метод обслуживания каждый раз, когда вам нужно значение. –
В том случае, если я хочу этого, мне действительно нужно посмотреть значение. В принципе, я хочу изменить «доступность» кнопки на основе значения этой переменной – pavlag
Итак, выставляем функцию службы в области (например, '$ scope.getCurrentPhaseValidity = userProgressService.getCurrentPhaseValidity;') и используйте '