2016-05-08 3 views
3

Wenn man durch die ng-repeats-Quelle schaut, sieht es nicht so aus, als gäbe es irgendeine Instanz davon, die for-of verwendet. Gibt es eine benutzerdefinierte Direktive, die diese oder eine andere Möglichkeit zum Erreichen dieser Schleife in Vorlagen verwendet, um Iteratorfunktionen zu verwenden?Verwendung von "for ... of" in ng-repeat

Klasse mit Iterator

class Cache{ 

    constructor(items){ 
    this.cache = { 
     "one" : 1, 
     "two" : 2 
    }; 
    }; 

    // custom iterator that turns our cache into an array 
    // for use in "for...of" loops 
    [Symbol.iterator](){ 
    var index = 0; 
    // turn cache object into array of its values (underscore method) 
    var data = _.values(this.cache); 

    return { 
     next: function(){ 
     if(index < data.length){ 
      return { 
      value: data[index++], 
      done: false 
      }; 
     }else{ 
      return { done:true }; 
     } 
     } 
    }; 
    }; 

}; 

var myCache = new Cache(); 
// looping my cache in simple js would look like 
for(let val of myCache){ 
    console.log(val); 
} 
// 1, 2 

vorgeschlagen AngularJS ng-Repeat-Richtlinie

<ul> 
    <li ng-repeat="item in myCache track by $index"></li> 
</ul> 

aber das funktioniert nicht als ng-Wiederholung nicht for...of nicht implementiert. Meine Frage ist: gibt es eine Möglichkeit, die ng-repeat-Direktive gut mit Iteratoren mit minimale Schnittstellenänderungen, oder noch besser, eine benutzerdefinierte Anweisung identisch mit ng-Wiederholung, die für for...of Schleifen gemacht wird?

+0

Dies kann Ihnen helfen: http://stackoverflow.com/questions/11873570/angularjs-for-loop-with-numbers-ranges –

+1

Die Syntax von ng-repeat ist 'Objekt im Array' oder' (Schlüssel, Wert) im Objekt'. Was versuchst du zu erreichen? –

+0

aktualisiert mit Beispiel – anson

Antwort

1

Sie nur Array.from verwenden könnte Ihre iterable Quelle in ein Array zu konvertieren, die ngRepeat wird iteriert der Lage sein:

scope.myCache = Array.from(new Cache()); 
:

<ul> 
    <li ng-repeat="item in Array.from(myCache) track by $index"></li> 
</ul> 

Im Idealfall in der Javascript-Richtlinie/Controller passieren würde dies

Anzeigen:

<ul> 
    <li ng-repeat="item in myCache track by $index"></li> 
</ul> 
+0

Danke, etwas Ähnliches oder Ähnliches könnte dem, wonach ich suche, am nächsten kommen, ohne eine benutzerdefinierte Wiederholungsanweisung zu schreiben. Ich habe wirklich auf eine weniger aufdringliche Schnittstelle gehofft, aber ich verstehe ng-repeat einfach nicht implementieren. – anson

Verwandte Themen