2016-08-02 8 views
3

Ich versuche, eine globale Eigenschaft auf dem Anwendungscontroller durch Klicken auf eine Schaltfläche auf einer der Vorlagen zu aktivieren. Ich habe einige Sachen über Action-Sprudeln gelesen, aber kann es nicht funktionieren.Senden von Aktionen an den Anwendungscontroller in EmberJS

Hier ist die Eigenschaft und Wirkung auf die Anwendungs ​​Controller

export default Ember.Controller.extend({ 
    isAuthenticated: true, 
    actions: { 
    logIn: function(){ 
     this.toggleProperty('isAuthenticated'); 
    } 
    } 
}); 

Und hier ist die Aktion mit einer login.hbs Vorlagendatei (Ich werde dies in eine richtige Taste schalten bald)

<span {{action 'logIn'}}> 
    {{#link-to 'boards' class="btn-l bg-blue white db mtl link bn w-100"}}Login{{/link-to}} 
</span> 

Wie kann ich sicherstellen, dass die Aktion die Eigenschaft auf dem Application Controller umschaltet?

Antwort

2

In Ihrem Login-Controller müssen Sie den Anwendungscontroller injizieren.

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    appCont:Ember.inject.controller('application') 
}); 

und in login.hbs müssen Sie angeben, welches Ziel den Methodenaufruf erhalten soll.

<button {{action 'logIn' target=appCont}}> Login </button> 

In diesem <button {{action 'logIn'}}> Login </button>, Kontext einer Vorlage ist Login-Controller, Aktionen auf diese Weise verwendet wird Blase Route einzuloggen, wenn der Login-Controller die angegebene Aktion nicht umsetzen wird. Sobald eine Aktion eine Login-Route erreicht, wird sie durch die Routenhierarchie geleitet.

Referenz: http://emberjs.com/api/classes/Ember.Templates.helpers.html#toc_specifying-a-target

EDIT: Wenn Sie in Controller innerhalb Component then you need to pass actions to zur Verfügung stehenden Funktionen nennen Component`

Login.hbs

{{component-a logIn=(action 'logIn') }} 

Komponente-a. hbs

<button {{action (action logIn)}}> LogIn</button> 
+1

oder in einer Funktion wie this.get ('fremdercontroller'). Send ("actionname", parameter1, parameter2 ...); Wenn der Fremdcontroller injiziert oder sowieso bereitgestellt wird –

+0

Würde dies auf die gleiche Weise mit einer Schaltfläche innerhalb einer Komponente funktionieren? – jermainecraig

+0

@jermainecraig Nein, da Sie den Controller nicht innerhalb der Komponente injizieren können. Dazu müssen Sie Abschlussaktionen verwenden, die von template.hbs an die Komponente gesendet werden sollen. – kumkanillam