我正在使用$ rootScope.requestObj来存储key的对象:代表某些过滤器的值。
在我的所有应用中,$ rootScope.requestObj被视为一个单例,它的行为是预期的。
但是,在调用外部API时,我创建了一个接收$ rootScope.requestObj作为参数的服务。
这是我的代码:
function requestHandler(obj /*In my controller I am passing $rootScope.requestObj*/) {
var internal_object = obj;
console.log('BEFORE FILTER = ', JSON.stringify($rootScope.requestObj));
Object.keys(internal_object).forEach(function (key) {
if (key != 'limit' && key != 'offset' && key != 'cities') {
internal_object[key] = null;
} else {
if (key == 'limit') {
internal_object[key] = REQUEST_LIMIT.simplyRETS; //outputs 500 that is simplyRETS limit for a request.
}
}
});
console.log('AFTER FILTER = ', JSON.stringify($rootScope.requestObj));
//Rest of the code, I basically serialize the internal_object and send it
//as params of a $http.get request.
正如您所看到的,我将$ rootScope.requestObj传递给了我的internal_object 我遍历内部对象,从不修改实际的$ rootScope.requestObj。仍然是第一个console.log输出:
请注意'maxprice'值。
BEFORE FILTER = {"type":null,"minprice":null,"maxprice":2,"minbeds":null,"maxbeds":null,"minbaths":null,"maxbaths":null,"minarea":null,"maxarea":null,"limit":500,"offset":0,"cities":"Aventura","q":null}
第二个这个=
AFTER FILTER = {"type":null,"minprice":null,"maxprice":null,"minbeds":null,"maxbeds":null,"minbaths":null,"maxbaths":null,"minarea":null,"maxarea":null,"limit":500,"offset":0,"cities":"Aventura","q":null}
在那个小迭代中,我从INTERNAL_OBJECT中移除了非限制,偏移或城市的所有内容,我的$ rootScope.requestObj更改并输出不同的值。
这里我只是为了简单而使用maxprice进行测试。我正在使用JSON.stringify()
来获取对象值的标记。
我相信我的internal_object和我的$ rootScope.requestObj对象之间仍然存在链接。但是,不确定为什么以及如何避免它。
修改
我混淆的原因是我假设var internal_object正在内存中创建新空间。正如所解释的那样,它正在创建一个参考。
答案 0 :(得分:0)
实际上,这是预期的行为,当您使用“var internal_object = obj;”时,您将obj的内存引用分配给internal_object,然后更改internal_object的值,即obj的相同引用。 如果你使用的是角度,只需使用“var internal_object = angular.copy(obj);”,这样它就会复制对象,而不是使用相同的内存引用。