我发现,当我在控制器内调用服务方法并将一个对象作为参数传递给它时,对该对象(在服务方法内部)所做的任何更改也会从我的控制器对原始对象进行。
我一直以为控制器数据应该保持不变,直到在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
我相信这是angular数据绑定的本质。如果要传递$scope
变量的详细信息,则可以copy
在服务端创建一个副本,从而利用angular的克隆功能或将服务更新为稍有不同。普通的CRUD样式的应用程序通常会传递id
一个实体,接收一个新实体或发布可能在大多数情况下已经存在于客户端的更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句