数据在 viewmodel 和 $sessionStorage 之间奇怪地同步
Data strangely synchronized between viewmodel and $sessionStorage
我正在 $sessionStorage
中存储一个对象列表。然后在我的一个控制器中,我获取该列表的值并将其显示在页面上,用户可以删除其项目。
问题是,当用户从视图模型中删除该列表的一项时,它也会从我不想要的 $sessionStorage
中删除。
这是我的控制器代码
(function () {
'use strict';
myModule.controller('infoCollecteArticlesController', ['$scope', '$rootScope', '$location', '$sessionStorage', 'global_factory', 'infoCollecteArticlesFactory',
function ($scope, $rootScope, $location, $sessionStorage, global_factory, infoCollecteArticlesFactory) {
var vm = this;
/*
* PUBLIC FUNCTIONS
*/
// Delete a URL from the vm
vm.deleteUrl = function(index) {
vm.web_urls.splice(index, 1);
}
// Watch sessionStorage
$scope.$watch(function () {
return $sessionStorage.currentCommuneData;
}, function (newVal, oldVal) {
if (newVal) {
vm.web_urls = newVal.web_information.web_urls;
vm.filters = newVal.web_information.stop_list;
}
else {
window.location.replace("test.html");
}
}, true);
}
]);
})();
复制 web_urls 以断开绑定
// Delete a URL from the vm
vm.deleteUrl = function(index) {
vm.web_urls = angular.copy(vm.web_urls).splice(index, 1);
}
您也可以复制 newVal 以便断开绑定
vm.web_urls = angular.copy(newVal.web_information.web_urls);
vm.web_urls = newVal.web_information.web_urls;
这一行直接引用同内存位置的sessionStorage变量的对象
因此,即使您从 vm.web_urls
中删除对象,sessionStorage 中的数据也会被删除。
而是使用
复制对象而不是引用
vm.web_urls = angular.copy(newVal.web_information.web_urls);
vm.filters = angular.copy(newVal.web_information.stop_list);
所以将 watch
函数更改为
$scope.$watch(function () {
return $sessionStorage.currentCommuneData;
}, function (newVal, oldVal) {
if (newVal) {
vm.web_urls = angular.copy(newVal.web_information.web_urls);
vm.filters = angular.copy(newVal.web_information.stop_list);
}
else {
window.location.replace("test.html");
}
}, true);
我正在 $sessionStorage
中存储一个对象列表。然后在我的一个控制器中,我获取该列表的值并将其显示在页面上,用户可以删除其项目。
问题是,当用户从视图模型中删除该列表的一项时,它也会从我不想要的 $sessionStorage
中删除。
这是我的控制器代码
(function () {
'use strict';
myModule.controller('infoCollecteArticlesController', ['$scope', '$rootScope', '$location', '$sessionStorage', 'global_factory', 'infoCollecteArticlesFactory',
function ($scope, $rootScope, $location, $sessionStorage, global_factory, infoCollecteArticlesFactory) {
var vm = this;
/*
* PUBLIC FUNCTIONS
*/
// Delete a URL from the vm
vm.deleteUrl = function(index) {
vm.web_urls.splice(index, 1);
}
// Watch sessionStorage
$scope.$watch(function () {
return $sessionStorage.currentCommuneData;
}, function (newVal, oldVal) {
if (newVal) {
vm.web_urls = newVal.web_information.web_urls;
vm.filters = newVal.web_information.stop_list;
}
else {
window.location.replace("test.html");
}
}, true);
}
]);
})();
复制 web_urls 以断开绑定
// Delete a URL from the vm
vm.deleteUrl = function(index) {
vm.web_urls = angular.copy(vm.web_urls).splice(index, 1);
}
您也可以复制 newVal 以便断开绑定
vm.web_urls = angular.copy(newVal.web_information.web_urls);
vm.web_urls = newVal.web_information.web_urls;
这一行直接引用同内存位置的sessionStorage变量的对象
因此,即使您从 vm.web_urls
中删除对象,sessionStorage 中的数据也会被删除。
而是使用
复制对象而不是引用vm.web_urls = angular.copy(newVal.web_information.web_urls);
vm.filters = angular.copy(newVal.web_information.stop_list);
所以将 watch
函数更改为
$scope.$watch(function () {
return $sessionStorage.currentCommuneData;
}, function (newVal, oldVal) {
if (newVal) {
vm.web_urls = angular.copy(newVal.web_information.web_urls);
vm.filters = angular.copy(newVal.web_information.stop_list);
}
else {
window.location.replace("test.html");
}
}, true);