Рассмотрим следующий пример:

var ar = [4, 2, 3];
ar.$x = 'something';
var br = angular.copy(ar);
console.dir(br);

br больше не имеет свойства $x, потому что при копировании массива angular повторяется с for (;;;), который не видит пользовательских свойств (если он повторяется с for in, тогда он будет работать ) .

Что из следующего я должен сделать?

  1. Создать массив как класс, а затем назначить свойство;
  2. Если это ошибка, сообщите об этом в angular;
  3. Измените мой код, потому что присвоение свойства массиву не является хорошей практикой;
5
karaxuna 16 Дек 2015 в 18:14

3 ответа

Лучший ответ

Попробуйте angular.merge () Это глубокая копия, которая включает перечисляемые свойства.

var ar = [4, 2, 3];
ar.$x = 'something';
var br = angular.merge([], ar);
console.dir(br);

Выход

Array[3]
  0: 4
  1: 2
  2: 3
  $x: "something"
  length: 3
  __proto__: Array[0]
5
Anthony Patton 17 Дек 2015 в 13:48

Попробуйте использовать jQuery:

JQuery.extend ([], ar);

var ar = [4, 2, 3];
ar.$x = 'something';
var br = jQuery.extend([], ar);
console.dir(br);
1
birwin 16 Дек 2015 в 16:04

Я думаю, что это не угловая проблема. Если вы называете такое заявление:

ar.$x = 'something';
console.log(Object.prototype.toString.call(ar));

Вы увидите, что [object Array] будет зарегистрирован. Вот как работает метод Array.isArray(), и, в свою очередь, именно так метод angular copy() решает, как перебрать сущность, переданную в качестве аргумента. Это обнаружение является важным циклом beacuse for ... in в массиве, что может привести к путанице в других случаях. Здесь описывается почему: Почему используется "для ... в" с итерацией массива - плохая идея?

Я бы посоветовал вам изменить код для этого конкретного случая.

2
Community 23 Май 2017 в 12:08