2016-04-19 12 views
1

Ich habe folgende Filter:Angular-Filterdienst mit Versprechen

app.filter("findDivision", function(divisionService) { 

    var isWaiting = false; 
    var returnValue = null; 

    function myFilter(input) { 

     var translationValue = "Loading..."; 
     if(returnValue) 
     { 
      translationValue = returnValue; 
     } else { 
      if(isWaiting === false) { 
       isWaiting = true; 
       divisionService.getDivisionById(input).then(function(data) { 
        console.log("GetTranslation done"); 
        returnValue = data[0].name; 
        isWaiting = false; 
       }); 
      } 
     } 

     return translationValue; 
    } 

    return myFilter; 
}); 

Wo die Funktion i in divisionService wie folgt aussieht nennen:

getDivisionById: function (id) { 
    var d = $q.defer(); 
    $http({ 
     url: api.getUrl2('division'), 
     method: "GET", 
     params: {filters: {id: {EQUAL: id}}} 
    }).success(function (data, status, headers, config) { 
     d.resolve(data); 
    }).error(function (data, status, headers, config) { 
     api.handleError(data); 
     console.log(data); 
     d.reject(data); 
    }); 
    return d.promise 
} 

Leider der Ausgang dieses sieht wie folgt aus:

enter image description here

Kann mir jemand sagen, warum das passiert ist ning? und wie kann ich den richtigen Wert bekommen?

+0

Filter sollen synchron sein, async-Dienst kann nicht verwendet werden. – dfsq

+1

Sie könnten es aber schaffen, in diesem Fall brauchen Sie statusbehafteten Filter: https://code.angularjs.org/1.3.7/docs/guide/filter In Ihrem Fall fügen Sie einfach eine Zeile hinzu, bevor Sie 'myFilter. $ Stateful = zurückgeben wahr; '. – dfsq

Antwort

1

Bei den ersten Aufrufen des Filters ist das Versprechen wahrscheinlich noch nicht gelöst, da der HTTP-Aufruf eine Weile dauert. Ihr Filtercode springt sofort zur Return-Anweisung return translationValue;. In diesem Fall gibt der Filter "Loading ..." zurück.

Leider überprüft der Filter den Filter nicht automatisch bis zum nächsten Digest-Zyklus. Angular hat keine Möglichkeit zu wissen, dass es einen anderen Digest-Zyklus ausführen soll, da sich nichts ändert (keine Benutzerinteraktion oder Änderungen an $ scope). Versuchen Sie als Experiment manuell einen Digest-Zyklus durch Ändern des Modells, z. mit einer input Box mit ng-model. In diesem Moment sehen Sie, dass der Filter erneut ausgewertet wird und die Ausgabe angezeigt wird.

+0

Wäre ich in der Lage, stattdessen eine Direktive zu erstellen, die dann den Dienst verwendet und den Text aktualisiert –

Verwandte Themen