2015-08-28 210 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

相關問題