AngularJS - 服务更改控制器数据
问题描述:
我发现,当我在控制器中调用一个服务方法并将一个对象作为参数传递给它时,对该对象所做的任何更改(内部服务方法)也会对原始对象来自我的控制器。AngularJS - 服务更改控制器数据
我一直认为控制器数据应该保持不变,直到我在承诺赢/错误事件中更改它,并且仅在需要时。
JS样本:
// Code goes here
var app = angular.module('App', []);
app.controller('AppCtrl', function($scope, simpleService){
$scope.data = { d: 1, c: 10};
$scope.clickMe = function(){
simpleService.clickMe($scope.data).then(function(res){
alert($scope.data.d);
})
.catch(function(err){
alert($scope.data.d);
});
}
});
app.factory('simpleService', function($q){
var simpleServiceMethods = {};
simpleServiceMethods.clickMe = function(data){
var deffered = $q.defer();
//data = JSON.parse(JSON.stringify(data)); - solution: clone data without references
data.d = 1111;
deffered.reject();
return deffered.promise;
}
return simpleServiceMethods;
});
Plunker演示:http://plnkr.co/edit/nHz2T7D2mJ0zXWjZZKP3?p=preview
答
我相信这是角度的数据绑定的本质。如果您想通过$scope
变量的详细信息,您可以利用角度的克隆功能与copy
或通过在服务端创建副本来更新您的服务以稍微不同的方式工作。正常的CRUD样式应用程序通常会传递实体的id
,接收新实体或发布可能在大多数情况下已经存在的客户端更改。
我不确定我是否理解这个问题,你知道AngularJS数据绑定吗? – Sphaso
问题是服务更改了我的控制器数据。这是正常的吗? – tbutcaru
这是如果您将$ scope变量传递给服务并更改它。这就是AngularJS数据绑定的工作原理 – Sphaso