2015-06-30 9 views
19

Ecco il percorso:Invio azione dal componente di instradare in ember.js

import Ember from 'ember'; 

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

E il codice del componente js:

import Ember from 'ember'; 

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

Quello che mi piacerebbe fare è (come il codice potrebbe suggerire;)) inviare un'azione dal componente al percorso, in modo che il percorso possa agire su di esso. Tuttavia, il codice sopra non funziona: il componente gestisce correttamente l'azione, ma la chiamata sendAction all'interno del metodo non fa nulla.

EDIT:

Ho risolto questo problema utilizzando:

this._controller.send('closeModal'); all'interno metodo di azione del componente tuttavia questa soluzione non mi soddisfano. Gli autori di braci stanno dicendo che i controller saranno rimossi in ember 2.0, quindi nel mio codice non voglio avere alcun riferimento a loro. Suggerimenti?

+0

ci mostri il modello in cui stai usando il componente? – GJK

risposta

30

Un componente ha un contesto isolato. Quindi non sa nulla di niente (rotta o controller) al di fuori del componente. Per poter inviare un'azione dal componente al percorso, si dovrebbe passare l'azione del percorso al componente nel modello in questo modo:

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

Ora quando si chiama this.sendAction('closeModal') nel componente, innescherà l'azione data al componente all'interno del modello, che in questo caso è l'azione closeModal del percorso.

Per ulteriori informazioni, consultare la documentazione (http://emberjs.com/api/classes/Ember.Component.html#method_sendAction)

UPDATE 3 agosto 2016

Per coloro che ha incontrato le azioni di chiusura nelle versioni più recenti di Ember, si potrebbe anche fare uso di tali azioni qui da fare:

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

l'operazione aiutante punterà ad un'azione del controller, nel componente è possibile chiamare o this.attrs.closeModal()this.get('closeModal')() per attivare l'azione anziché chiamare sendAction.

Il vantaggio di queste azioni è che l'azione potrebbe restituire un valore che può essere utilizzato nel componente. Nel caso di un modale, questo può essere utilizzato ad esempio per determinare se una modale può essere chiusa o meno se viene chiamato lo closeAction, se restituisce false, ad esempio, si potrebbe decidere di impedire la chiusura della modale.

Come nota a margine, le azioni di chiusura puntare sempre al controller, in modo da farla puntare ad un'azione di percorso, si potrebbe dare un'occhiata a questo componente aggiuntivo: https://github.com/DockYard/ember-route-action-helper

+0

C'è un modo "più carino" per fare ciò inviando tutte le azioni o semplicemente definendo l'attributo, ad es. {{Your-component closeModal}}? grazie – rssfrncs

+2

@rssfrncs L'unica cosa che posso pensare è aggiungere la proprietà 'closeModal: 'closeModal'' al tuo componente, in questo modo chiamerà per impostazione predefinita l'azione' closeModal 'quando viene chiamato sendAction (' closeModal ')'. Quindi non devi più passare l'azione quando definisci il componente nel tuo modello. – jcbvm

+5

"[Il componente] non sa nulla di nulla (percorso o controller) al di fuori di [stesso]" - questo è un concetto davvero importante che non ero riuscito a comprendere prima di leggere questa risposta. –

Problemi correlati