2016-12-08 5 views
0

Я использую $ 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 к моему 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(), чтобы получить отметку стоимости объекта на данный момент.

Я верю, что по-прежнему существует связь между моим внутренним объектом и объектом $ rootScope.requestObj. Однако, не уверен, почему и как его избежать.

Редактировать

Источником моего замешательства было то, что я предполагал, вар internal_object создавал новое пространство в памяти. Хотя, как объяснялось, это создавало ссылку.

ответ

0

На самом деле, это ожидаемое поведение, когда вы используете «var internal_object = obj;», вы назначаете ссылку памяти obj на internal_object, а затем вы изменяете значения inner_object, то есть такую ​​же ссылку на obj , Если вы используете угловой, просто используйте «var internal_object = angular.copy (obj);», поэтому он скопирует объект, вместо того, чтобы использовать одну и ту же ссылку на память.

+0

Я просто не могу поверить, как что-то так просто меня достало. Благодаря! –