Angular - 对象似乎相互绑定但实际上并非如此
Angular - Objects seem bound to eachother but arent
我有一个编辑页面,用户可以在其中编辑系统中的文件,然后保存它。加载文件时,我从结果中创建了两个对象,一个绑定到视图,另一个我希望保留(在其原始状态)直到 "save" 被单击,然后用它与视图绑定对象,以查看是否进行了任何更改。
因此,当页面加载时,这是 运行
$http.get('/api/files/' + $stateParams.id)
.then(function (result) {
vm.fileTemp = result.data;
vm.fileTempCopy = result.data;
fileTempCopy 未被视图中或控制器中其他地方的任何内容触及或引用,保存方法除外,我在其中检查它们是否相似。但是不知何故,当我更改输入字段时,它们都会更新(就好像它们都被用作输入的 ng-model 一样)。
if(vm.fileTemp === vm.fileTempCopy)//in save-function
永远为真,他们的字段完全一样
为什么会发生这种情况,我该如何解决?
使用赋值运算符,你实际上只是在引用原始数组。数组是引用类型。这意味着,它们实际上并不存储值,它们只存储对这些值的引用。您所做的是复制对内存位置的引用,这意味着对该位置内存的任何更改(包括删除元素)都将反映在两个数组中。
所以你会想要这样做:
vm.fileTemp = angular.copy(result.data);
vm.fileTempCopy = angular.copy(result.data);
这是检查对象 "value equality" 的一种非常基本的方法。
function isEquivalent(a, b) {
// Create arrays of property names
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
// If number of properties is different,
// objects are not equivalent
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i];
// If values of same property are not equal,
// objects are not equivalent
if (a[propName] !== b[propName]) {
return false;
}
}
// If we made it this far, objects
// are considered equivalent
return true;
}
//After your update Outputs: false
console.log(isEquivalent(vm.fileTemp, vm.fileTempCopy));
我有一个编辑页面,用户可以在其中编辑系统中的文件,然后保存它。加载文件时,我从结果中创建了两个对象,一个绑定到视图,另一个我希望保留(在其原始状态)直到 "save" 被单击,然后用它与视图绑定对象,以查看是否进行了任何更改。
因此,当页面加载时,这是 运行
$http.get('/api/files/' + $stateParams.id)
.then(function (result) {
vm.fileTemp = result.data;
vm.fileTempCopy = result.data;
fileTempCopy 未被视图中或控制器中其他地方的任何内容触及或引用,保存方法除外,我在其中检查它们是否相似。但是不知何故,当我更改输入字段时,它们都会更新(就好像它们都被用作输入的 ng-model 一样)。
if(vm.fileTemp === vm.fileTempCopy)//in save-function
永远为真,他们的字段完全一样
为什么会发生这种情况,我该如何解决?
使用赋值运算符,你实际上只是在引用原始数组。数组是引用类型。这意味着,它们实际上并不存储值,它们只存储对这些值的引用。您所做的是复制对内存位置的引用,这意味着对该位置内存的任何更改(包括删除元素)都将反映在两个数组中。
所以你会想要这样做:
vm.fileTemp = angular.copy(result.data);
vm.fileTempCopy = angular.copy(result.data);
这是检查对象 "value equality" 的一种非常基本的方法。
function isEquivalent(a, b) {
// Create arrays of property names
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
// If number of properties is different,
// objects are not equivalent
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i];
// If values of same property are not equal,
// objects are not equivalent
if (a[propName] !== b[propName]) {
return false;
}
}
// If we made it this far, objects
// are considered equivalent
return true;
}
//After your update Outputs: false
console.log(isEquivalent(vm.fileTemp, vm.fileTempCopy));