我发现当我在控制器中调用一个服务方法并将一个对象作为参数传递给它时,对该对象(在服务方法内)所做的任何更改也都会从我的控制器对原始对象进行。< / p>
我一直认为控制器数据应该保持不变,直到我在promise win / error事件中更改它,并且只有在我需要的时候。
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
答案 0 :(得分:0)
我相信这是角度数据绑定的本质。如果您想传递$scope
变量的详细信息,可以使用copy
的角度克隆功能,或者通过在服务端创建副本来更新您的服务,使其工作略有不同。正常的CRUD样式应用程序通常会通过实体的id
,接收新实体或发布更改,这些更改在大多数情况下已经存在于客户端。