AngularJS : Wie $http in einen filter
Ich würde gerne eine Anfrage in mein backend in einem filter und gibt das Ergebnis meiner Anfrage.
Das problem ist der service $http-return-ein Versprechen, und es ist das Problem.
Für das Thema verwendete ich eine $timeout und die Versprechen Winkel-in meinem fiddle :
meine Geige
In meinem filter verwende ich einen $timeout mit einem Versprechen, aber das Ziel ist, verwenden Sie eine Anfrage http :
myApp.filter('filterHello', function ($http,$timeout,$q) {
return function (company_id) {
console.log("in the filter");
var deferred = $q.defer();
$timeout(function() {
deferred.resolve("ca marche");
}, 2000);
return deferred.promise;
};
});
Dann in meine anzeigen, ich benutze meinen filter, der ist wohl auf die Anzeige "ca marche" mit einer Verzögerung von 2 Sekunden, aber das funktioniert nicht :
<div ng-controller="MyCtrl">
{{hello|filterHello}}
</div>
Können Sie sehen, dass der filter nichts zurück und es ist eine Endlosschleife, in der filter, da der null-Versprechen, denke ich.
Wenn Sie nicht verstehen, warum ich wollen, verwenden Sie eine http-Anfrage in einem filter die Antwort ist einfach.
Zum Beispiel habe ich ein Benutzer-Objekt mit den Feldern : email,name,company_id..
Und ich habe eine andere Firma Objekt mit den Feldern : name, createOn,...
Ich möchte die filter, wie dies für den Namen des Benutzers Firma :
{{user.company_id | ShowNameCompany}}
So, ich muss eine http-Anfrage in die filter für mein Unternehmen die controller in meinem backend.
Ich hoffe mir kann jemand helfen.
- Poste den code, den Sie versucht, bitte
- Verknüpfen Sie Ihre Geige
- Filter Feuer eine MENGE! Es muss eine größere Bandbreite freundschaftlichen Methode von der Erreichung Ihrer Ziele.
- Die fiddle-link nicht angezeigt, weil es eine
[2]:
vor. Und weiter SO, Sie können nicht einen link zu posten jsfiddle.net ohne auch das hinzufügen einiger code auf Ihre Frage. Bitte fügen Sie einige code, und stellen Sie sicher, dass der link korrekt ist. Danke. - Was ist das Endziel hier? Warum sind Sie mit $http-Filter in den ersten Platz?
- Ja sorry ich fixe den link für die Geige. Mike, ich Stimme mit Ihnen überein, aber wenn ich den cache für meine Anfrage, ich werde tun, nur eine Anfrage und bekommt dann die Daten in den cache
- Ich aktualisiere einfach meinen post, wo ich erklären, mein Ziel.
- Das update macht es klingen wie Sie sollten, erstellen Sie eine Richtlinie, nicht um einen filter.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denke ich, sollten Sie nicht verwenden die Filter, die Art und Weise. Filter sind für die Transformation von inputs basierend auf den optionalen params.
Das problem hier wäre, dass man sofort die Rückkehr ein Versprechen aus der filter-Funktion. Und das ist nichts Eckig umgehen kann als Ergebnis eines filters.
Mein Vorschlag daher wäre dies - das Ergebnis Holen Erstens, die Arbeit mit dem filter basierend auf dem Ergebnis:
und in der Vorlage:
Edit: Gerade gelesen Ihre Erklärung. Zu mir, dies wäre ein Kandidat für eine Richtlinie:
und in der Vorlage:
Wenn Sie haben eine Menge von Unternehmen, Sie sollten laden Sie den Namen (vielleicht schicken Sie mit der ersten Resonanz zu Beginn?), als wären Sie bombardieren Ihre server ziemlich mit Anfragen.
Oder verwenden Sie ein stateful-filter:
und verwenden Sie es wie so:
{{company_id | companyName}}
Achtung: Die Funktion companyNameFilter aufgerufen sein, jeder digest-Zyklus.
Außerdem würden Sie brauchen, um herauszufinden, eine Möglichkeit zum zurücksetzen des cache, wenn es wächst zu groß.
Finden Sie unter: https://glebbahmutov.com/blog/async-angular-filter/
Und die plunker (der link oben nicht angezeigt, so hier ist ein direkter link): http://plnkr.co/edit/EK2TYI1NZevojOFDpaOG?p=preview
{{company_id | companyName}}
jedoch verwenden Sie diese benutzerdefinierten filter in einem controller? Bei der controller-Konstruktion wieconsole.log('ctrl Filter:', $filter('companyName')($scope.company_id));
hat nicht funktioniert! Vielleicht hat jemand beheben könnte es auch für andere verwenden, nicht nur in einer Ansicht. beste GrüßeWenn Sie eine http-Anforderung in einem filter wie ich fand auch ein Grund, vor kurzem, dann tun Sie es wie unten gezeigt an.
Beachten Sie, dass das Winkel-team rät von der Verwendung von stateful-Filter, ich zitiere aus Ihrer Dokumentation
Werde durch diese Empfehlung, hier ist was Sie tun sollten:
Erklären Sie Ihre filter, so dass es nimmt eine scope-Objekt als ersten parameter:
function filter($http) {
Definieren Sie eine variable, die verfügbar sein wird im Rahmen der Vorlage. Ich rufe mir filterCache und weisen und leeres Objekt {} zu.
Rufen Sie das filter aus dem inneren der Vorlage wie diese: