控制器在服务内操作对象时出现问题
Trouble with Controllers to manipulate an Object inside a Service
我有一个应该可以在许多控制器中访问的对象。
此对象在服务中,具有默认值,控制器稍后可能会更改这些值。
我的问题是我在服务中的对象保持控制器更改的值。
当控制器获取对象时,我总是希望它获取具有默认值的对象。 (不是之前由其他控制器修改过的值...)
我的服务中有这个:
this.myObject = {'item1' : 'something', 'item2' : 'other' , .....};
我知道这是不正确的,因为 this.
所以我试着做了一个这样的方法:
this.createMyObject = function() {
var obj = myObject;
return obj;
}
并在我的控制器中调用 createMyObject();
但这也不起作用。
我知道解决方案可能很明显。
谢谢。
如果您想要的是 myObject
的 副本,您想要做的是:
var obj = angular.copy(myObject);
因为var obj = myObject;
只会复制对象的引用,而不是它的内容。
Object
in Javascript 除非复制或克隆,否则通过引用传递。所以当你在做
this.createMyObject = function() {
var obj = myObject;
return obj;
}
myObject
的引用正在分配给 obj
因此,obj
中的任何更改也会更新 myObject
。
考虑使用 angular.extend or angular.copy
this.createMyObject = function() {
var obj = {};
angular.copy(myObject, obj);
// or
// obj = angular.copy(myObject);
return obj;
}
尝试以下解决方案:
服务代码:
.service('MyService', function() {
var myObject = {
'item1': '',
'items2': ''
};
/**
* Used to return copy of myObject with some default values
*/
this.createMyObject = function() {
return angular.copy(myObject);
};
this.alterMyObject = function() {
// @TODO here myObject can be used to edit directly
};
});
注意:
两个对象之间的“=”运算符仅用于将 RHS obj 的引用分配给 LHS。因此,对 LHS 对象的任何进一步更改也将反映到 RHS obj。
我有一个应该可以在许多控制器中访问的对象。
此对象在服务中,具有默认值,控制器稍后可能会更改这些值。
我的问题是我在服务中的对象保持控制器更改的值。
当控制器获取对象时,我总是希望它获取具有默认值的对象。 (不是之前由其他控制器修改过的值...)
我的服务中有这个:
this.myObject = {'item1' : 'something', 'item2' : 'other' , .....};
我知道这是不正确的,因为 this.
所以我试着做了一个这样的方法:
this.createMyObject = function() {
var obj = myObject;
return obj;
}
并在我的控制器中调用 createMyObject();
但这也不起作用。
我知道解决方案可能很明显。
谢谢。
如果您想要的是 myObject
的 副本,您想要做的是:
var obj = angular.copy(myObject);
因为var obj = myObject;
只会复制对象的引用,而不是它的内容。
Object
in Javascript 除非复制或克隆,否则通过引用传递。所以当你在做
this.createMyObject = function() {
var obj = myObject;
return obj;
}
myObject
的引用正在分配给 obj
因此,obj
中的任何更改也会更新 myObject
。
考虑使用 angular.extend or angular.copy
this.createMyObject = function() {
var obj = {};
angular.copy(myObject, obj);
// or
// obj = angular.copy(myObject);
return obj;
}
尝试以下解决方案:
服务代码:
.service('MyService', function() {
var myObject = {
'item1': '',
'items2': ''
};
/**
* Used to return copy of myObject with some default values
*/
this.createMyObject = function() {
return angular.copy(myObject);
};
this.alterMyObject = function() {
// @TODO here myObject can be used to edit directly
};
});
注意: 两个对象之间的“=”运算符仅用于将 RHS obj 的引用分配给 LHS。因此,对 LHS 对象的任何进一步更改也将反映到 RHS obj。