2016-01-11 6 views
5

Ich benutze Ember 2.2.0Verwenden von this.sendAction() in Komponenten?

Beim Schreiben von Komponenten habe ich Ereignisse mit der this.sendAction(…) von der Komponente auf die Route (oder was bettet die Komponente) propagiert. Ich habe kürzlich die Dokumente überprüft und festgestellt, dass sie einen anderen Ansatz empfehlen. https://guides.emberjs.com/v2.2.0/components/triggering-changes-with-actions/

this.get('action')(); 

Seit Ember ist bekannt, sehr eigenwillig zu sein, die ich so viel zu den besten Praktiken wie möglich halten will. Aber ich bin nicht sicher, ob die Dokumente veraltet sind oder die Tutorials mit sendActions sind.

Also ich möchte, was ist der Weg, dies zu tun?

+0

Die dezimale Version ist wichtig - Ember 2.was? –

+0

ember 2.2.0 Entschuldigung – maximusmusterus

+0

Gehen Sie davon aus, dass die neueste Version der Guides so aktuell wie möglich ist. Das Dokumentationsteam hat sich viel Mühe gegeben, es so zu machen. – locks

Antwort

10

Wenn Sie this.sendAction('actionName') verwenden Sie sprudelt eine Aktion auf, die Sie auf dem Bauteil/Controller fangen müssen werden mit actions

//controller/route/component.js 
actions: { 
    actionName: function() { 
    //Do something 
    } 
} 

Wenn Sie, dass bis die Kette senden möchten, werden Sie Rufen Sie erneut sendAction('') auf der Komponente/Controller und fangen Sie es erneut auf dem übergeordneten (und so weiter).

Der andere Ansatz this.get('action')() verwendet Schließaktionen, die reguläre JavaScript-Funktionen sind. Dies ist der bevorzugte Weg, um in Ember 1.13.X, soweit ich weiß, Aktionen aufzurufen. Eine nette Sache, die Schließaktionen haben, ist, dass Sie Rückgabewerte haben können. Was bedeutet, dass Sie etwas davon haben kann:

//a controller 
actions: { 
    saveResult() { 
    return this.get('model').save(); //notice the return (which returns a promise) 
    } 
} 

//some template that uses the controller above 
{{a-component save=(action 'saveResult')}} // Passes the saveResult action to the component 

//a-component.js 
actions: { 
    someAction: function() { 
    this.attrs.save().then(() => { 
     //Do something with the return value 
    }); 
    } 
} 

kann viel über Schließung Aktionen geschrieben werden, aber andere haben viel besser als ich es könnte geschrieben, so empfehle ich folgende Artikel:

Und wenn Sie mit dem gesamten DDAU-Konzept (Data Down Actions Up) neu sind, empfehle ich wirklich, das Konzept im Allgemeinen Sam's article.

Update: Es gibt auch ein Addon (in den Kommentaren von @locks verlinkt), das closure actions to bubble to routes erlaubt.

+0

Danke für diese ausgezeichnete Antwort! Werde die Artikel auschecken. :) Danke vielmals! – maximusmusterus

+0

Ich bin froh, dass ich helfen konnte. Ich hatte auch Schwierigkeiten, diese Konzepte zu lernen! Viel Glück mit Ihrer Glut Hilfe. –

+0

Danke! Der einzige Nachteil ist, dass ich {{my-component onSomething = (Aktion 'theAction')}} nicht verwenden kann, wenn 'theAction' innerhalb der Route definiert ist. Also entweder muss ich einen Controller verwenden (wird soweit ich weiß, veraltet) oder alles in eine zusätzliche Komponente verpacken. Im Moment wollte ich modellspezifische Aktionen (bearbeiten, erstellen) auf Routenebene bearbeiten. – maximusmusterus