2015-10-02 2 views
4

Рассмотрим следующую функцию в службе:Angular.copy() не копирует все свойства

$scope.addPeriod = function(newPeriod) {   
     if(newPeriod.from !== '' && newPeriod.until !== '') {   
      var index = $scope.newPeriods.indexOf(newPeriod);  
      $scope.newPeriods.splice(index, 1); 
      $scope.setHolidayEditions(newPeriod); 


      console.log("Check period"); 
      console.log(newPeriod); // state 1: object newPeriod is as expected, it contains holidayEdtions 

      console.log("Check period copy"); 
      console.log(angular.copy(newPeriod)); //state 2 : object newPeriod is missing the holidayeditions! 
      $scope.periods.push(angular.copy(newPeriod)); //original code 
      //some more logic irrelevant to the question 
     } 
} 

Проблема заключается в angular.copy(). Структура объекта newPeriod выглядит следующим образом:

имеет дату «от» и «до» и массив предметов журнала. Тогда есть функция $ scope.setHolidayEditions (newPeriod). В основном это добавляет массив экземпляров для каждого журнала. Эта функция работает. Я знаю это из-за вывода на консоль. В исходном коде период затем начинается в массив периодов, который затем отображается на экране. Угловой.copy() был сделан, вероятно, для того, чтобы избежать справочных проблем.

Но угловое копирование(), похоже, не копирует вновь созданный массив изданий в объектах журнала. Для этого есть причина?

В основном это то, что происходит в сервисной функции:

У меня есть объект с именем newPeriod, который выглядит примерно так:

{ 
    from:"02/10/2015", 
    until:"09/10/2015", 
    magazines: [ 
      {title:"some title", number:"some number", code:"magazineCode"}, 
      {title:"other title", number:"other number", code:"magazineCode2"} 
    ] 
} 

после функции $ scope.setHolidayEditions (newPeriod) объект выглядит следующим образом:

{ 
      from:"02/10/2015", 
      until:"09/10/2015", 
      magazines: [ 
        {title:"some title", number:"some number", code:"magazineCode", holidayEditions:["date","date","date"]}, 
        {title:"other title", number:"other number", code:"magazineCode2", holidayEditions:["date","date","date"]} 
      ] 
} 

Но после angular.copy (newPeriod), объект выглядит следующим образом снова:

{ 
     from:"02/10/2015", 
     until:"09/10/2015", 
     magazines: [ 
       {title:"some title", number:"some number", code:"magazineCode"}, 
       {title:"other title", number:"other number", code:"magazineCode2"} 
     ] 
    } 

Угловой.copy() не копировал массив праздничных данных из журналов. И мне интересно, почему?

+0

предоставьте больше условий. –

+2

Ничего неправильного в показанном коде, который бы представлял такую ​​проблему. Создайте демоверсию, которая повторяет этот – charlietfl

+0

Мне придется делать это дома, так как я должен продолжать работать над своим спринтом. Я не могу просто скопировать код компании для очевидных советов :-). –

ответ

6

Вы правы, и я столкнулся с той же проблемой некоторое время назад. Поэтому (а также по некоторым другим причинам), я решил использовать lodash, который обеспечивает функцию по этой проблеме:

_.cloneDeep(value, [customizer], [thisArg])

Создает глубокий клон значения. Если настроен клиент, он вызывается для создания клонированных значений. Если customizer возвращает неопределенное клонирование, обрабатывается методом вместо этого. Настройщик привязан к thisArg и вызывается с тремя аргументами; (value [, index|key, object]).

Примечание: Этот метод основан на алгоритме структурированного клонирования. Перечислимые свойства аргументов объектов и объектов, созданных конструкторами, отличными от Object, клонируются к простым объектам Object. Пустой объект возвращается для неквалифицированных значений, таких как функции, DOM-узлы, карты, наборы и слабые карты.

Смежные вопросы