Was ich will: eine Fehlerbehandlung, die global verschiedene http-Fehler (401, 404, 500) behandelt. Es sollte nicht wichtig sein, wo oder wann ein HTTP-Fehler auftritt.
Bisher habe ich eine Fehleraktion in der Anwendungsroute implementiert, die bei jedem Adapterfehler auf dem model
-Hook der Route aufgerufen wird. Das funktioniert gut.
Was nicht behandelt wird, ist der Fall, wenn ich mit Datensätzen in anderen Kontexten wie record.save()
arbeite. Dort muss ich den Fehler auf dem Versprechen separat behandeln.
Außerdem möchte ich nicht nur einen Standardfehlerhandler haben, sondern eher einen Fallback.
Ok, bevor wir zu viel reden, haben wir eine Beispielimplementierung meiner Anwendungsfälle.
Anwendungsroute
Die Anwendungsfehleraktion sollte der Standard / Fallback-Fehlerhandler sein.
%Vor%Eine Route
In diesem Fall wird die Anwendungsfehleraktion aufgerufen.
%Vor%Einige Controller
In diesem Fall wird die Anwendungsfehleraktion NICHT aufgerufen.
(Ich weiß, der folgende Code macht wahrscheinlich keinen Sinn, aber er soll nur meine Anforderungen veranschaulichen)
%Vor%Ein anderer Controller
In diesem Beispiel wird die Anwendungsfehleraktion sicher nicht aufgerufen, da ich hier meinen eigenen Handler verwende ( catch()
).
Aber wie Sie in den Kommentaren sehen können, möchte ich den Standard-Handler für alle anderen Statuscodes als 404 verwenden.
Gibt es also einen sauberen und genehmigten Weg, das zu erreichen? Ich hoffe, ich konnte dir mein Problem klar machen.
Sie können versuchen, etwas mit diesen Ereignissen zu tun (setzen Sie diese Zeilen vor der App-Initialisierung in app.js):
%Vor%Ich habe von Ссылка etwas über sie erfahren. Vielleicht finden Sie hier einige Details dort.
Ich denke, ich habe meine endgültige Lösung, die ich mit dir teilen möchte. Im Grunde nahm ich die Ideen der Jungs, die meine Frage kommentierten und sie so erweiterten, dass sie meinen Bedürfnissen entsprachen.
Zuerst habe ich ein Mixin mit der Hauptlogik erstellt. Da ich möchte, dass es so allgemein wie möglich ist, unterscheidet es zwischen a) Controller / Route und b) jquery / Adapterfehler. Es spielt also keine Rolle, von wo Sie es aufrufen und ob Ihr Fehlerobjekt ursprünglich von einer Jquery-Ajax-Anfrage oder einem Ember-Adapter stammt.
%Vor%Als nächstes habe ich einige Klassen (in app.js) wieder geöffnet, um diese Funktionalität global verfügbar zu machen:
%Vor%Schließlich habe ich einige Aktionen zur Anwendungsroute hinzugefügt:
%Vor% Warum habe ich zwei Aktionen, die dasselbe machen? Nun, die Aktion error
wird bei Fehlern auf dem Modellhook der Route aufgerufen. Ich könnte bei dieser Aktion bleiben, aber im Rest der Anwendung, wo ich diese Aktion explizit nenne, möchte ich einen aussagekräftigeren Namen. Daher habe ich auch eine ajaxError
Aktion erstellt. Du könntest sicher mit einer Aktion bleiben.
Jetzt können Sie das überall verwenden:
Route / Controller :
this.ajaxError(error);
Komponente :
this.sendAction('ajaxError', error);
Natürlich müssen Sie die Aktion auch an die Komponente übergeben, die von der Anwendungsroute behandelt werden soll:
{{some-component ajaxError="ajaxError"}}
Dies funktioniert auch für verschachtelte Komponenten. Sie müssen diese Aktion nicht explizit in der Datei component.js weiterleiten, da wir die Komponente erneut geöffnet und diese Aktion in
eingefügt habenIch hoffe, ich kann anderen Leuten bei dieser Implementierung helfen. Auch jede Rückmeldung ist willkommen.
Tags und Links ember.js