2015-02-20 16 views
7

Ich lerne gerade Ember.js und lief in ein kleines Problem. Ich habe einen Dienst, wo ich will eine andere Methode nenne ich im gleichen Objekt definiert haben, etwa so:Call-Methode von einer anderen Methode in Ember Service

export default Ember.Service.extend({ 
    myMethod: function() { ... }, 

    otherMethod: function() { 
    this.myMethod(); // <---- this doesn't work 
    this.get('myMethod')(); // <---- also doesn't work 
    Ember.run.bind(this, this.myMethod)() // <---- no dice 
    } 
}); 

Gibt es eine Möglichkeit, dies zu tun? Ich würde gerne Code in meiner Codebasis wiederverwenden.

Danke.

+0

Ihre Frage ist auf jede Art von Detail wirklich kurz, z.B. Wie initialisierst du 'myMethod()' auf deinem Dienst? Aber Sie sollten 'Ember.Service' nicht erweitern, sondern' Ember.Object', und Sie sollten es richtig initialisieren: http://emberjs.com/guides/understanding-ember/dependency-injection-and-service-lookup/ – Leeft

+0

... das ist Teil eines Ember Trainingskurses, also mache ich es einfach so, wie sie mir sagen, dass ich sollte. Ich bin nicht sicher, welche anderen Arten von Details notwendig sind. Sollte ich nicht in der Lage sein, die Methode eines Objekts aus sich heraus zu nennen? – Jason

+0

Angenommen, Sie erstellen eine Art neues Objekt mit dieser Klasse und rufen dann 'serviceObject.otherMethod()' auf, sollten Sie damit kein Problem haben. Es gibt nichts in dem Code, den Sie gezeigt haben, der das verbieten würde, also muss es sein, wie Sie es erstellen oder verwenden. – Leeft

Antwort

2

Ich schätze, dass Sie von diesem Punkt bereits weitergegangen sind. Aber hier ist ein Ember-Twiddle nur für den Fall, dass demonstriert, wie ein Service seine eigenen Methoden verweisen kann. Wie es in den Kommentaren gesagt wurde, ist es eine Javascript-Sache über this.

https://ember-twiddle.com/7caf29fe1df7f36e6e3e49578fc3aed3?openFiles=services.movie-service.js%2Ctemplates.components.movie-viewer.hbs

+0

Ich weiß, das ist alt, aber wie würde ich dieses Gerede funktionieren lassen? Ich habe im Grunde einen Funktionsaufruf, 'displayMovies()', zu der Aktion hinzugefügt, die Sie in Ihrem Twiddle https://ember-twiddle.com/27aebdeb9ab75841ee16b3dbd8df3f76?openFiles=services.movie-service.js%2Ctemplates.components.movie-viewer vorgenommen haben .hbs – mk2

+1

Hallo @MarcusRenno, wenn ich deine Twiddle richtig lese, möchtest du die Anzeige von Filmen mit dem Filmservice auslösen. Ich würde jedoch davon abraten. Der Filmservice ist ein Singleton und könnte die Komponente, auf der Sie Objekte anzeigen möchten, überleben oder Sie möchten sie für mehrere verschiedene Komponenten freigeben. Stattdessen ist das Speichern der Daten mit dem Service und das Verwenden von Komponenten wahrscheinlich die beste Wette. – shane

+1

Das ist ein guter Vorschlag, aber das Problem, das ich zu stellen versuchte, war anders. Die Funktion displayMovies wurde gerade erstellt, um zu versuchen, eine Funktion innerhalb einer anderen Funktion zu verwenden, falls eine Funktion zu groß wird. Ich mag es, Funktionalitäten getrennt zu halten, so dass es einfacher zu lesen/zu warten ist – mk2

Verwandte Themen