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=…或将属性复制到监视的对象。如果它解决了您的原始问题以帮助其他人,请接受此答案…以其他方式更新管理器。