2013-06-19 9 views
15

Ich brauche sublist Direktive an wenigen Stellen der Seite, und es sollte manchmal volle fields Liste enthalten, aber manchmal gefiltert. Hier ist mein naiver Ansatz:Angular.js Passfilter auf Direktive bidirektionale ('=') Attribut

HTML:

<div ng-controller="MainCtrl"> 
     <sublist fields="fields" /> <!-- This one is OK --> 
     <sublist fields="fields | filter: 'Rumba'" /> <!-- This one raises error --> 
    </div> 

Javascript:

angular.module('myApp', []) 
    .directive('sublist', function() { 
     return { 
      restrict: 'E', 
      scope: { fields: '=' }, 
      template: '<div ng-repeat="f in fields">{{f}}</div>' 
     }; 
    }) 
    .controller('MainCtrl', function($scope) { 
     $scope.fields = ['Samba', 'Rumba', 'Cha cha cha']; 
    }); 

http://jsfiddle.net/GDfxd/14/

Wenn ich versuche, Filter zu verwenden ich diesen Fehler:

Error: 10 $digest() iterations reached. Aborting! 

Gibt es eine Lösung für dieses Problem?

Antwort

24

Der $ Digest Iterationen Fehler tritt in der Regel auf, wenn ein Watcher das Modell ändert. Im Fehlerfall ist die Bindung des Isolats fields an das Ergebnis eines Filters gebunden. Diese Bindung erzeugt einen Beobachter. Da der Filter jedes Mal, wenn er ausgeführt wird, ein neues Objekt von einem Funktionsaufruf zurückgibt, wird der Watcher kontinuierlich ausgelöst, weil der alte Wert niemals mit dem neuen übereinstimmt (siehe this comment from Igor in Google Groups).

wäre ein gutes fix fields in beiden Fällen wie zu binden sein:

<sublist fields="fields" /></sublist> 

Und ein weiteres optionales Attribut auf den zweiten Fall für die Filterung hinzufügen:

<sublist fields="fields" filter-by="'Rumba'" /></sublist> 

dann Ihre Direktive wie anpassen:

return { 
    restrict: 'E', 
    scope: { 
     fields: '=', 
     filterBy: '=' 
    }, 
    template: '<div ng-repeat="f in fields | filter:filterBy">'+ 
       '<small>here i am:</small> {{f}}</div>' 
}; 

Hinweis: Denken Sie daran, Ihre sublist Tags zu schließen deine Geige.

Here is a fiddle

+0

+1 für die Erklärung und die Referenz. –

+0

Was ist, wenn Sie möglicherweise mehrere Filter, Sortierungen usw. benötigen? Gibt es eine allgemeine Lösung, um eine allgemeine gefilterte/sortierte Liste an eine Direktive zu übergeben? –

+0

@EugeneOsovetsky: An diesem Punkt ist es wahrscheinlich einfacher/notwendig, das Heavy-Lifting in der direktiven Link/Controller-Funktion durchzuführen, indem dort '$ filter' injiziert wird. (Das heißt, dieser Q & A-Kontext ist die Ansicht und nicht der Controller-Teil des MVC-Paradigmas. Der Controller lässt viel mehr Komplexität zu.) Siehe [stackoverflow.com/a/14302334/2185093](http://stackoverflow.com/a/14302334/2185093) für weitere Informationen – sh0ber

1

Corrected Fiddle

Überprüfen Sie ein Ergebniss zu here.

In der Geige müssen Sie schließende Tags haben. Sie können immer noch eigenständige Tags wie das, das Sie haben, haben.

<sublist fields="fields" filter="'Rumba'"/> <!-- Tested in chrome --> 
+0

Sie können auch "gefilterte" Daten im Bereich Ihrer Steuerung haben. Dafür müssen Sie den '$ filter'-Dienst in Ihren Controller injizieren. enthaltene Referenz zeigt dies. –

+0

Sie können Ihre Antwort bearbeiten und aktualisieren, anstatt Informationen in den Comments hinzuzufügen .... –

Verwandte Themen