Javascript 将角度服务对象绑定到控制器作用域并更新

Javascript 将角度服务对象绑定到控制器作用域并更新,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我有一个EmployeeService,我将它注入EmployeeController。EmployeeService包含一个对象 我将服务对象绑定到控制器范围: app.controller('EmployeeController', function($scope, EmployeeService) { $scope.employee = EmployeeService.getEmployee(); } HTML模板显示员工的姓名: {{employee.name}} 如果我在E

我有一个
EmployeeService
,我将它注入
EmployeeController
EmployeeService
包含一个对象

我将服务对象绑定到控制器范围:

app.controller('EmployeeController', function($scope, EmployeeService) {
    $scope.employee = EmployeeService.getEmployee();
}
HTML模板显示员工的姓名:

{{employee.name}}
如果我在
EmployeeService
中操作employee对象。。。i、 e.
EmployeeService.getEmployee().name='newname'
,模板将显示新名称

但是,如果我替换
EmployeeService
中的employee对象,。。。i、 e.
EmployeeService.setEmployee({name:'newname'})
模板不显示新名称

为什么替换服务对象没有反映在模板中

我有以下几个例子来证明这一点:

在我的Plunk中,员工控制器/服务工作,经理控制器/服务不工作


如果有人能帮我理解发生了什么,我将非常感激。

这是因为安格尔观察原始物体的方式。如果声明
{{employee.name}
angular将开始监视对象引用的更改。 正如您所说:对
EmployeeService.getEmployee().name
的更改会被正确地注意到并反映在视图中


但是
EmployeeService.setEmployee({name:'new name'})
将监视的对象替换为新对象,而angular仍监视原始对象。因此,angular无法识别您的更改,视图也不会更新。

您需要控制器来监视管理器的更改

$scope.$watch(function() {
    return ManagerService.getManager();//<--when this changes
  }, function(newManager) { //<-- run this function
    $scope.manager = ManagerService.getManager();
  });
$scope.$watch(函数(){

return ManagerService.getManager();//好的……这是有道理的。不幸的是,这是我编写的一个简单示例,我们的企业应用程序…Restangular拉下了一个大型复杂对象,我需要将其放入服务并将其绑定到控制器作用域。有什么想法吗?仅在检索到该对象后将其添加到作用域。
$Scope.employee=…或将属性复制到监视的对象。如果它解决了您的原始问题以帮助其他人,请接受此答案…以其他方式更新管理器。