AngularJS' $rootScope. Невозможно создать внутреннюю переменную
Я использую $rootScope.requestObj для хранения объекта ключа: значения, которые представляют определенные фильтры.
На протяжении всего моего приложения $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 своему внутреннему объекту. Я перебираю внутренний объект, никогда не изменяя фактический $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()
получить штамп стоимости объекта на данный момент.
Я полагаю, что между моим внутренним объектом и моим объектом $rootScope.requestObj все еще есть связь. Однако не уверен, почему и как этого избежать.
редактировать
Источником моего замешательства было то, что я предположил, что var internal_object создает новое пространство в памяти. Пока, как объяснили, создавал ссылку.
1 ответ
На самом деле, это ожидаемое поведение, когда вы используете "var internal_object = obj;", вы присваиваете ссылку на память obj для internal_object, а затем изменяете значения internal_object, то есть той же ссылки на obj. Если вы используете angular, просто используйте "var internal_object = angular.copy(obj);", чтобы он копировал объект, а не использовал ту же ссылку на память.