0

我從api獲取ajax數據並將其保存到變量中。我必須對這些數據進行「編輯和保存」或「編輯和取消」更改。我正在使用ng-model來顯示和編輯這些數據。爲什麼angularjs改變不同的變量?

這裏是我的腳本:

function getData() { 
    $http({ 
     method: 'POST', 
     url: API + '/api/Educations/UserEducations', 
     data: {} 
    }).then(function successCallback(response) { 
     vm.UserData = response.data; 
     vm.CachedUserData = response.data; 
    }) 
} 

這裏是我的html:

<div ng-repeat="education in editEducationsCtrl.UserData"> 
    <div>{{education.SchoolName}}</div> 
    <input type="text" ng-model="education.SchoolName"> 

    <button ng-click="editEducationsCtrl.saveChanges()">Save</button> 
    <button ng-click="editEducationsCtrl.cancelChanges()">Cancel</button> 
</div> 

當用戶點擊取消按鈕,我想編寫HTML緩存數據。 但是, 當我嘗試訪問vm.CachedUserData變量時,我看到這個緩存數據已經隨着vm.UserData的新值而改變......怎麼樣?我檢查了我的代碼,沒有函數訪問CachedUserData變量。即使我將變量名稱更改爲唯一名稱,但結果相同。

我想將第一個數據保存在變量中。但角度改變他們兩個。 2路數據綁定是否會更改連接相同ajax數據的所有變量?

回答

3

我建議你使用angular.copy()到要緩存中的數據綁定:

vm.UserData = response.data; 
vm.CachedUserData = angular.copy(response.data); 
+0

它的工作,謝謝但Html視圖不改變,當我分配'vm.UserData = vm.CachedData'。你能幫我解決這個問題嗎? – Sam

+0

沒有意義,大概這個變量名是錯的,應該是'vm.CachedUserData'? –

3

=在JavaScript中不克隆該變量,它會在其上創建另一個指針。這意味着您可以通過使用vm.UserDatavm.CachedUserData來處理您的變量。 似乎要克隆你的變量,所以:

如果它是一個數組:

... 
}).then(function successCallback(response) { 
    vm.UserData = response.data.splice(0); 
    vm.CachedUserData = response.data.splice(0); 
}) 
... 

如果它是一個對象:

  • var newObject = jQuery.extend({}, oldObject);如果你有JQuery的
  • obj = JSON.parse(JSON.stringify(o)); without JQuery

這是用於克隆JS中對象的good link

+1

有'angular.copy'或'angular.merge'爲對象的淺/深拷貝。 – Walfrat

+0

絕對如此。謝謝你的評論! :-) – Mistalis

+0

謝謝。它的工作,但現在我有一個不同的問題。當我分配'vm.UserData = vm.CachedData'時,Html視圖不會改變。你能幫我解決這個問題嗎? – Sam