Как следить за изменениями в одном конкретном атрибуте элемента вложенного массива в Angular JS?

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

$rootScope.array = [{

                    "id":"a",
                    "title":"a",
                    "options":[
                                {
                                  "optId":"abc",
                                  "isInvalid":false
                                },
                                {
                                  "optId":"efg",
                                  "isInvalid":false
                                }
                              ]
                  },
                  {
                    "id":"b",
                    "title":"b",
                    "options":[
                                {
                                  "optId":"hij",
                                  "isInvalid":false
                                },
                                {
                                  "optId":"lmn",
                                  "isInvalid":false
                                }
                              ]
                  }];

На любое изменение в 'isInvalid"атрибут внутри"options', Я хочу вызвать функцию, которая будет оценивать весь массив и установить некоторые свойства'trueи некоторые кfalse".

Я понимаю, что что-то подобное можно сделать, используя глубокую эквивалентность $watch объекта, но я не уверен, что именно я могу наблюдать только за изменениями в 'isInvalid"и не меняйся, скажем,"optId".

В общих чертах, я намерен проверить весь массив с помощью набора бизнес-правил. Так что, еслиisInvalid"атрибут первого объекта меняется наtrue"Я хочу убедиться, чтоisInvalid'второго объекта установлен на'false' и так далее.

Так что, если есть лучший способ сделать это, кроме $watchЯ все уши, потому что я относительно новичок в Angular и я немного растерялся!

3 ответа

Решение

Если ваша структура не слишком большая, глубокие часы помогут вам.

http://teropa.info/blog/2014/01/26/the-three-watch-depths-of-angularjs.html

Если вы беспокоитесь о производительности и в зависимости от своего сценария, вы можете оценить, что вы делаете что-то вроде

Имея родительский / глобальный флаг isInvalid, всякий раз, когда флаг помечается как недопустимая метка, а также глобальный недействительный, вам нужно только следить за глобальным недопустимым флагом, и как только этот флаг является недействительным, просмотрите недопустимый элемент.

Другие варианты, которые мне приходят на ум, могут заключаться в том, чтобы добавить наблюдение за каждой записью в массиве, но не уверен, что это может иметь худшую производительность, чем решение DeepWatch.

Если вы не совершаете глубокого надругательства, это может быть хорошим решением для вашего сценария.

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

Строка проверки будет выглядеть примерно так: "a|abcfalseefgfalseb|hijfalselmnfalse"

Если isInvalid значение изменится, строка проверки изменится, и часы сработают.

   $scope.$watch(function() {
      var check = "";
      for (var i = 0; i < $scope.array.length; i++) {
      var item = $scope.array[i];
      check += item.id + "|"; 
        for (var j = 0; j < item.options.length; j++) {         
          var option = item.options[j];
          check += option.id + item.isInvalid;
        }
      }
      return check;
  }, doSomething());

Если вы не хотите использовать глубокие часы. Вы также можете определить свою собственную логику часов. Согласно угловому документу. В $watch(expression) функция выражения будет выполняться несколько раз в течение $digest. Таким образом, вы можете использовать свой собственный код для обнаружения изменений в вашем огромном массиве.

Демо-версия: http://plnkr.co/edit/X4J5Faoa2ni79RmFa3co?p=preview (откройте консоль, чтобы просмотреть журнал).

Другие вопросы по тегам