2016-01-03 3 views
2

Я создал фильтр для сортировки вопросов по категориям.Угловой фильтр работает больше, чем ожидалось

Я пытаюсь выяснить, почему мой угловой фильтр работает больше, чем входное значение.

Первый выпуск: Фильтр выполняется до вопросов заселены:

enter image description here

Затем запустите еще раз, когда существует объект вопрос:

enter image description here

Второй выпуск: В моей директиве scope.questions массив содержит только один код stion, но фильтр работает 6 раз? Почему это?

Директива HTML фрагмент кода:

<div class="category-filter"> 
     <div ng-repeat="(k, v) in catfilters" class="question"> 
      <input type="checkbox" ng-init="checked=true" ng-model="catfilters[k]">{{ k }} 
     </div> 
    </div> 

Loop:

<div class="question-category"> 
     <li ng-repeat="q in questions | bycategory:catfilters" class="question"> 
      {{q.question.category.category}} 
     </li> 
    </div> 

Директива JS: фрагмент кода

scope.questions = args; 

    console.log(scope.questions.length); //Length == 1 
    /* 
     Dynamically add question filters 
    */ 
    scope.questions.forEach(function (k, v) { 
     scope.catfilters[k.question.category.category] = true; 
    }); 

Фильтр:

filter('bycategory', function() { 
     return function (questions, catfilterObj) { 

      console.log('Q', questions); // Called 6 times 

      var items = { 
       categories: catfilterObj, 
       out: [] 
      }; 

      angular.forEach(questions, function (value, key) { 
       if (this.categories[value.question.cat_id] === true) { 
        this.out.push(value); 
       } 
      }, items); 
      return items.out; 
     }; 
    } 
+3

То, что вы видите, это природа, как работают угловые дайджесты. Они выполняются как минимум 2 раза, пока область не станет стабильной, и больше, если изменения в области видимости будут обнаружены из дайджеста. – charlietfl

+0

@charlietfl есть ли способ сделать это более эффективным? 6 вызовов довольно хардкор для массива, содержащего один объект – Growler

+0

Является ли это причиной проблем с производительностью? – charlietfl

ответ

1

Как указывает @charlietfl, ваши угловые выражения будут по-прежнему вызываться до тех пор, пока масштаб не стабилизируется.

Это не должно быть проблемой, если вы не заметить, что это будет причиной проблем с производительностью, но если вы обеспокоены тем, вы могли бы elminate некоторые из ненужных операций в фильтре:

filter('bycategory', function() { 
    return function (questions, catfilterObj) { 

     console.log('Q', questions); // Called 6 times 

     return Array.prototype.filter.call(questions, function (value) { 
      return catfilterObj[value.question.cat_id] === true; 
     }); 
    }; 
}) 
0

Если использовать контроллер $ фильтры для предотвращения $ переваривать проблемы производительности
Давайте читать больше на here

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