Richtige Weg, um ein ajax-Aufruf von EmberJs-Komponente?
Ich würde gerne wissen, was ist der richtige Weg, um ein ajax-Aufruf von einem ember Komponente. zum Beispiel
Ich möchte erstellen Sie eine wiederverwendbare Komponente, die macht einen Mitarbeiter suchen nach Mitarbeiter-Id, wenn dann die Antwort kommt wieder von dem server will ich eine Aktualisierung des Modells mit den Daten aus der ajax-Antwort.
Ich weiß nicht, ob dies der richtige Weg, es zu tun, ich bin wirklich neu auf emberjs.
export default Ember.Component.extend({
ajax: Ember.inject.service(),
actions: {
doSearch() {
showLoadingData();
var self = this;
this.get('ajax').post('http://server.ip.com/api/v1/getEmployee', { "id": this }).then(function(data) {
self.set('model.name', data.name);
self.set('model.position', data.position);
hideLoadingData();
});
}
}});
InformationsquelleAutor DeividKamui | 2017-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: habe ich falsch verstanden, die Frage, also hier ist eine aktualisierte version meiner Antwort:
Erste, ich denke, Sie sollten wechseln, um mit ember-data. Dann Holen ein Mitarbeiter von id wäre nur zu lösen, um den Aufruf
this.get("store").find("employee", id)
.Wenn Sie möchten, benutzen Sie einfach ajax, schlage ich vor, daß Sie erstellen Sie ein Service, kapselt Besonderheiten (API-endpoint-URL, Daten-format, und so weiter) und nur stellt einfache Methoden für die Suche und Aktualisierung Modelle.
Sind und sich schließlich im Einklang mit den "Daten nach unten, Aktionen in der" Muster, sollten Sie nicht aktualisieren Sie das Modell dieser Komponente. Stattdessen senden Sie eine Aktion, zu der parent-controller/Komponente. Etwa so:
app/components/employee-selector.js
(die Komponente, die Sie schreiben):app/templates/new/it-request.hbs
:app/controllers/new/it-request.js
:Alte Antwort:
Eine idiomatische Lösung wäre, dies in einem
Route
.Zuerst sollten Sie hinzufügen eine route in
app/router.js
:Definieren als die Strecke in
app/employees/show/route.js
:(Der einzige Grund, warum ich wickelte alles in einem neuen Versprechen ist es, Reaktion-Anpassungs - ersetzen Sie einfach
resolve(response)
mit einem code, wandelt die raw-Antwort vom server, und rufen Sieresolve
mit diesem transformierte version).Aber wenn Sie haben mehr Kommunikation mit der API, und ich nehme an, Sie wird, schlage ich vor, dass Sie versuchen, mit ember-Daten oder andere Daten-layer-Bibliothek für ember (wahrscheinlich Orbit).
Oder zumindest schreiben Sie eine service , abstracts entfernt die gesamte Kommunikation mit der API und verwenden Sie es überall Sie verwenden würden, raw ajax-Anfragen.
OK, sorry, habe ich missverstanden. In diesem Fall ist die Komponente OK, aber dennoch denke ich, sollten Sie extrahieren Sie die ajax-Logik in einem service, oder wechseln Sie zu ember-Daten.
Und noch eins - diese Komponente wohl nicht, aktualisieren Sie das Modell selbst, aber er sollte statt dessen senden Sie eine Aktion, mit der neue Mitarbeiter-Daten, so dass die übergeordnete Komponente/controller damit umgehen können, und aktualisieren Sie das Modell entsprechend.
alle Beispiel, wie man das update durchführen?
Ich habe soeben die Antwort mit dem Beispiel.
InformationsquelleAutor edziubudzik
War ich mit Ember-Klasse direkt in action es sah so aus wie diese
Und andere Weise zu kommunizieren, mit WERDEN, ist die Verwendung von Ember zu Speichern (wie Sie sagte), dann in route, die Sie bekommen können model WERDEN
Beispiel
Wenn Sie sparen möchten-Modell-Daten dann verwenden Sie im laden Methoden speichern bietet Ihnen verschiedene Methoden, wie FINDEN, Sie ALLE und andere
Das problem mit dem store ist, dass alle meine back-end-services sind auf verschiedenen Servern zum Beispiel. die Mitarbeiterdaten werden in form kommt, sql.core.Daten/Mitarbeiter andere Daten im Zusammenhang mit der employeee kommt von webserver.apis.intranet/api/v1/getResources soweit ich das verstehe dies beinhaltet das erstellen, die für jedes Modell einen adapter und einen serializer, dazu führen, dass einige Daten auf soap-format. Normalerweise auf jquery erstellt habe ich latente Anrufe, aber ich bin mir nicht sicher, wie Sie Sie erstellen, dieses Verhalten auf emberjs
vielleicht versuchen Sie leere host-adapter und verwenden Sie diese Methode zum ändern von urls für Modelle importieren JSONAPIAdapter von 'ember-data/Adapter/json-api'; export Standard JSONAPIAdapter.extend({ pathForType: function(type) { return Ember.String.Unterstrich(Typ); } }); Sie können eine Art Schalter in es
Ich habe versucht, mit JSONAPIAdapter und es funktioniert nicht so statt, dass ich die DS.Adapter, aber muss ich erstellen für jedes Modell die gleichen adapter, die ich meine, einige Daten ändern, aber die Anforderung an den Endpunkt ist der gleiche. zum Beispiel mein Modell Mitarbeiter (id,name,depto,Titel) muss die info aus dem sql.core.Daten/Mitarbeiter, aber mein Modell Vorgesetzten müssen die gleichen Daten wie Mitarbeiter-aber mit zwei weiteren Parametern (dtoId, aktiv) ich versuche, die Vererbung verwenden, aber die Anfrage an den server wirklich chaotisch und nicht als würde ich erwartet.
InformationsquelleAutor Kejt
Gibt es mehrere Möglichkeiten, wie Sie dies tun können!
Erstens, Ember hat eine convient alias für jQuery:
Ember.$
. Also, wenn Sie vertraut jQuery, das sollte leicht genug sein.Können Sie auch Ember RSVP Paket. Es gibt eine gutes Beispiel hier auf, wie eine Anfrage zu stellen und etwas mit der Antwort.
Drittens, Sie können die ember-ajax service.
Aber, was du fragst (update des Modells mit den Daten aus der ajax-response) wird bereits in Ember Data. Sie müssen Ihre Karte API in das, was ember rechnet mit einem adapter und/oder ein serializer. Sobald Ihr Dienst ist, verwandelt in das, was Ember erwartet, können Sie Abfrage-server für einen einzelnen Datensatz speichern Sie es dann.
InformationsquelleAutor Rimian