У меня есть EmployeeService
который я ввожу в EmployeeController
. Служба EmployeeService
содержит объект.
Я привязываю объект службы к области контроллера:
app.controller('EmployeeController', function($scope, EmployeeService) {
$scope.employee = EmployeeService.getEmployee();
}
В шаблоне HTML отображается имя Employee:
{{employee.name}}
Если я манипулирую объектом employee в EmployeeService
... т.е. EmployeeService.getEmployee().name = 'new name'
, шаблон отображает новое имя.
Однако, если я заменю объект employee в EmployeeService
... т.е. EmployeeService.setEmployee({name: 'new name'})
шаблон не отображает новое имя.
Почему замена объекта службы не отражается в шаблоне?
У меня есть следующий Plunk, который демонстрирует это: http://plnkr.co/edit/k7oKd1VgsBvMGvVdP5kM?p=preview
В моем Plunk, Employee Controller/Service работает и Manager Controller/Service нет.
Если бы кто-нибудь мог помочь мне понять, что происходит, я бы очень признателен.
Вам нужен контроллер, чтобы следить за изменениями в менеджере.
$scope.$watch(function() {
return ManagerService.getManager();//<--when this changes
}, function(newManager) { //<-- run this function
$scope.manager = ManagerService.getManager();
});
Вот обновленный Plunkr с одним из способов сделать это: http://plnkr.co/edit/YE72JcxDSFqfZLH32ERy?p=preview
Это связано с тем, что угловой наблюдает за оригинальным объектом. Если вы объявляете {{employee.name}}
угловые начинают смотреть ссылку на объект для изменений. Как вы сказали: изменения в EmployeeService.getEmployee().name
правильно замечены и отражены в представлении.
Но EmployeeService.setEmployee({name: 'new name'})
заменяет наблюдаемый объект новым объектом, в то время как угловой все еще смотрит на оригинал. Следовательно, ваше изменение не распознается угловым, и представление не обновляется.
$scope.employee = ...
или скопировать свойства в отслеживаемый объект. И, пожалуйста, примите этот ответ, если он решил ваш первоначальный вопрос, чтобы помочь другим ...