2016-05-08 19 views
0

Ich habe eine sehr einfache Komponente, die zwei Aktionen hat, starten und stoppen. Diese werden ausgelöst, wenn Sie auf Schaltflächen klicken. Die erste Aktion wird auf die Route geleitet und funktioniert wie erwartet, die zweite Aktion wird jedoch in der Komponente ausgelöst, jedoch nicht auf die Route.Ember.js (v2.4.5) Komponente vergibt keine zweite Aktion

Ich habe gerade angefangen, mit Ember herumzuspielen, aber ich nehme an, dass Komponenten mehr als eine Handlung vorführen können?

Es gibt keine Fehler in der Konsole, die Schaltfläche tut nichts und das Konsolenprotokoll von der Route wird nie angezeigt.

Komponente Aktionen

actions: { 

    start() { 
    console.log('component start called'); 
    this.sendAction('start', this.get('item')); 
    }, 

    stop() { 
    console.log('component stop called'); 
    this.sendAction('stop', this.get('item')); 
    } 
} 

Routen Aktionen

actions: { 
    start (server) { 
     console.log('route start called'); 
     server.set("settings.amazonTask", 'start'); 
     server.save(); 
    }, 

    stop (server) { 
     console.log('route stop called'); 
     server.set('settings.amazonTask', 'stop'); 
     server.save(); 
    } 
} 

Vorlage

<button type="button" 
     class="btn btn-default btn-sm" {{action "start"}}> 
    Turn on 
</button> 


<button type="button" 
     class="btn btn-default btn-sm" {{action "stop"}}> 
    Turn off 
</button> 

Antwort

1

Sie ha ve, die Aktionen geben bis zu Ihrer Komponente:

{{my-component start=(action 'start') stop=(action 'stop')}} 

Und dann können Sie dann mit sendAction nennen.

Aber ich empfehle dringend, die neue Syntax zu verwenden und direkt auf die Aktionen auf dem Objekt attrs zuzugreifen. Dies ist viel klarer und deutlich macht, was geschieht:

this.attrs['start'](this.get('item')) 

Tatsächlich ist die action Helfer bekommt nur eine Aktion aus dem actions Objekt und begrenzt sie auf den aktuellen Kontext. Das Ergebnis davon kann an die Komponente übergeben werden und dann von dort aufgerufen werden, in dem Kontext, in dem Sie den action Helper ausgeführt haben.

Beachten Sie, dass das Aufrufen des action-Helfers auf einer bereits erstellten Aktion die Aktion nicht zurückschnellt, sondern sie nur passiert.

+0

Dies natürlich funktioniert, hatte ich die Aktion für den Start festgelegt, aber die Aktion für den Stopp vergessen. Ich bin ein wenig verwirrt über den Rest Ihres Kommentars, obwohl ich weiß, was Sie eigentlich empfehlen. Können Sie einen Link zu den Dokumenten/Leitfäden oder ein weiteres detailliertes Beispiel angeben? –

+1

Vielleicht Checkout der [ursprünglichen Blog-Post] (http://emberjs.com/blog/2015/06/12/ember-1-13-0-released.html#toc_close-actions). Ich empfehle, 'sendAction' nicht zu verwenden, da seine verwirrende Magie und normalerweise mit' this.attrs ['action']() 'whis ein eindeutiger Funktionsaufruf ist, der auch eindeutig ein Ergebnis liefert. – Lux