Связывание объекта Angular Service с областью контроллера и обновление

0

У меня есть 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 нет.

Если бы кто-нибудь мог помочь мне понять, что происходит, я бы очень признателен.

Теги:
angularjs-scope

2 ответа

1
Лучший ответ

Вам нужен контроллер, чтобы следить за изменениями в менеджере.

$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

1

Это связано с тем, что угловой наблюдает за оригинальным объектом. Если вы объявляете {{employee.name}} угловые начинают смотреть ссылку на объект для изменений. Как вы сказали: изменения в EmployeeService.getEmployee().name правильно замечены и отражены в представлении.

Но EmployeeService.setEmployee({name: 'new name'}) заменяет наблюдаемый объект новым объектом, в то время как угловой все еще смотрит на оригинал. Следовательно, ваше изменение не распознается угловым, и представление не обновляется.

  • 0
    Хорошо ... это имеет смысл. У меня, к сожалению, проблема в том, что это простой пример, который я собрал, и наше корпоративное приложение ... Restangular тянет за собой большой сложный объект, и мне нужно поместить его в Service и связать с Controller Scope. Есть идеи?
  • 0
    Добавляйте этот объект в область только после его получения. $scope.employee = ... или скопировать свойства в отслеживаемый объект. И, пожалуйста, примите этот ответ, если он решил ваш первоначальный вопрос, чтобы помочь другим ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню