2014-10-09 4 views
2

Я пытаюсь сгруппировать свою коллекцию на основе свойства, и в то же время я хотел бы отфильтровать свою коллекцию с одним свойством.Угловая группа и фильтр

Когда я попробовать следующее,

<div data-ng-repeat="(group,parameter) in parameters | filter : { 'type' : '!GroupType' }| groupBy :'group'"> 
         <fieldset> 
          <legend>{{group}}</legend> 
          <div data-ng-repeat="par in parameter"> 
           <myfield ng-model="par.value" parameter="par" entry-map="entryMap"></myfield> 
          </div> 
         </fieldset> 
        </div> 

Я получаю много ошибок на консоли следующим образом,

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting! 
Watchers fired in the last 5 iterations: 

Я не имею любые часы на моей коллекции. Каков правильный способ сделать это.

+0

Я почти уверен, что проблема связана с реализацией фильтра «groupBy», не могли бы вы поделиться этим кодом? Благодаря! – Josep

+0

Я не реализовал группу самостоятельно, я использую угловой модуль здесь https://github.com/a8m/angular-filter – Kathir

+0

Извините, мне потребовалось столько времени, чтобы ответить вам, пожалуйста, взгляните на мою ответьте и дайте мне знать, каковы ваши мысли. Благодаря! – Josep

ответ

2

Я бы посоветовал вам не использовать, что реализация «GroupBy» $filter, используйте this one instead:

angular.module("sbrpr.filters", []) 
.filter('groupBy', function() { 
    var results={}; 
    return function (data, key) { 
     if (!(data && key)) return; 
     var result; 
     if(!this.$id){ 
      result={}; 
     }else{ 
      var scopeId = this.$id; 
      if(!results[scopeId]){ 
       results[scopeId]={}; 
       this.$on("$destroy", function() { 
        delete results[scopeId]; 
       }); 
      } 
      result = results[scopeId]; 
     } 

     for(var groupKey in result) 
      result[groupKey].splice(0,result[groupKey].length); 

     for (var i=0; i<data.length; i++) { 
      if (!result[data[i][key]]) 
       result[data[i][key]]=[]; 
      result[data[i][key]].push(data[i]); 
     } 

     var keys = Object.keys(result); 
     for(var k=0; k<keys.length; k++){ 
      if(result[keys[k]].length===0) 
      delete result[keys[k]]; 
     } 
     return result; 
    }; 
}); 

Кроме того, have a look at this post, где я обсуждаю, почему реализация, что вы используете на самом деле очень плохо.

И, наконец, пожалуйста, support my answer here. Благодаря!

+0

Я проверю это и обновлю вас. – Kathir

+0

@ Kathir спасибо! – Josep

+1

работает для меня. Спасибо за ссылку, она ясно объяснила все это. – Kathir