2015-06-30 9 views
19

Hier ist die Route:Senden Aktion von der Komponente zu routen in Ember.js

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    actions: { 
     closeModal: function() { 
      alert('asdf'); 
     } 
    } 
}); 

und die Komponente js Code:

import Ember from 'ember'; 

export default Ember.Component.extend({ 
    actions: { 
     closeModal: function() { 
      this.sendAction('closeModal'); 
     } 
    } 
}); 

Was ich möchte, ist zu tun (wie der Code kann vorschlagen;)) eine Aktion von Komponente zu Route senden, damit die Route darauf einwirken kann. Der obige Code funktioniert jedoch nicht - die Komponente verarbeitet die Aktion ordnungsgemäß, aber der Aufruf sendAction innerhalb der Methode führt zu nichts.

EDIT:

Ich löste dieses Problem mit:

this._controller.send('closeModal'); innerhalb Aktion-Methode der Komponente jedoch diese Lösung mich nicht erfüllt. Ember-Autoren sagen, dass Controller in Ember 2.0 entfernt werden, daher möchte ich in meinem Code keine Verweise darauf haben. Vorschläge?

+0

Können Sie uns die Vorlage zeigen, wo Du benutzt die Komponente? – GJK

Antwort

30

Eine Komponente hat einen isolierten Kontext. Es kennt also nichts (Route oder Controller) außerhalb der Komponente. Um eine Aktion von Ihrer Komponente zu Ihrer Route zu senden, sollten Sie die Route der Aktion auf die Komponente in Ihrer Vorlage passieren etwa so:

// your template 
{{your-component closeModal="closeModal"}} 

Wenn Sie jetzt this.sendAction('closeModal') in Ihrer Komponente aufrufen, löst es die Aktion gegeben zu der Komponente innerhalb Ihrer Vorlage, die in diesem Fall die Aktion Ihrer Route ist.

Weitere Informationen finden Sie die Dokumentation (http://emberjs.com/api/classes/Ember.Component.html#method_sendAction)

UPDATE 3. August 2016

Für diejenigen, die in neueren Versionen von Ember Schließung Aktionen auftreten, können Sie dort auch solche Aktionen hier machen könnten durch tun:

// your template 
{{your-component closeModal=(action "closeModal")}} 

Aktion Helfer auf eine Aktion des Controllers zeigen wird, in der Komponente können Sie anrufen this.attrs.closeModal() oder this.get('closeModal')(), um die Aktion auszulösen, anstatt sendAction aufzurufen.

Der Vorteil dieser Aktionen besteht darin, dass die Aktion möglicherweise einen Wert zurückgibt, der in der Komponente verwendet werden kann. Im Fall eines Modals kann dies zum Beispiel verwendet werden, um zu bestimmen, ob ein Modal geschlossen sein kann oder nicht, wenn closeAction aufgerufen wird, wenn es zum Beispiel false zurückgibt, könnten Sie beschließen, das Schließen des Modals zu verhindern.

Als Randbemerkung, die Verschluss Aktionen verweisen immer auf dem Controller, um es auf eine Route Aktion zeigen zu lassen, können Sie einen Blick auf dieses Addon nehmen könnte: https://github.com/DockYard/ember-route-action-helper

+0

Gibt es eine "schönere" Möglichkeit, dies zu tun, indem Sie entweder alle Aktionen senden oder nur das Attribut definieren, z. B. {{your-component closeModal}}? danke – rssfrncs

+2

@rssffrncs Das einzige, was ich mir vorstellen kann, ist das Hinzufügen der Eigenschaft 'closeModal: 'closeModal'' zu Ihrer Komponente, so dass es standardmäßig die Aktion' closeModal 'aufruft, wenn' sendAction (' closeModal ') 'aufgerufen wird. Sie müssen die Aktion also nicht mehr weitergeben, wenn Sie die Komponente in Ihrer Vorlage definieren. – jcbvm

+5

"[Die Komponente] weiß nichts über irgendetwas (Route oder Controller) außerhalb von [sich]" - das ist ein wirklich wichtiges Konzept, das ich vor dem Lesen dieser Antwort nicht verstanden hatte. –

Verwandte Themen