2015-08-28 101 views
0

我发现,当我在控制器中调用一个服务方法并将一个对象作为参数传递给它时,对该对象所做的任何更改(内部服务方法)也会对原始对象来自我的控制器。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

+0

我不确定我是否理解这个问题,你知道AngularJS数据绑定吗? – Sphaso

+0

问题是服务更改了我的控制器数据。这是正常的吗? – tbutcaru

+0

这是如果您将$ scope变量传递给服务并更改它。这就是AngularJS数据绑定的工作原理 – Sphaso

回答

0

我相信这是角度的数据绑定的本质。如果您想通过$scope变量的详细信息,您可以利用角度的克隆功能与copy或通过在服务端创建副本来更新您的服务以稍微不同的方式工作。正常的CRUD样式应用程序通常会传递实体的id,接收新实体或发布可能在大多数情况下已经存在的客户端更改。

+0

即使我不传递''范围''变量我有相同的行为。它也适用于普通物体吗? – tbutcaru

+0

如果服务正在对传递给它的任何内容进行更改,那么是的,您会期望这些更改。如果您不希望对传递给服务的原始内容所做的更改,则可以在该服务中创建一个副本,对其进行更改并返回该内容,而不是最初传递的内容。 – jh3y

+0

明白了。这是我在与Angular合作的9个月中第一次遇到这种情况,这就是为什么我感到困惑。正如你所说,到现在为止我只传递一个实体的''id'',但这次我不得不通过整个事情。 – tbutcaru

相关问题