2016-01-11 18 views
5

Sto usando Ember 2.2.0Utilizzare this.sendAction() nei componenti?

Durante la scrittura di componenti che ho usato per propagare gli eventi dal componente al percorso (o qualunque incorpora il componente) con this.sendAction(…). Ho controllato i documenti ultimamente e ho scoperto che consigliavano un altro approccio. https://guides.emberjs.com/v2.2.0/components/triggering-changes-with-actions/

this.get('action')(); 

Dal Ember è noto per essere molto supponente voglio restare tanto per le migliori pratiche possibili. Ma non sono sicuro che i documenti potrebbero essere scaduti o che i tutorial che utilizzano sendActions lo siano.

Quindi mi piacerebbe qual è il modo di fare questo?

+0

La versione decimale è importante - Ember 2. cosa? –

+0

ember 2.2.0 scusa – maximusmusterus

+0

Supponiamo che l'ultima versione delle guide sia la più aggiornata possibile, il team di documentazione si è preso molta cura di farlo. – locks

risposta

10

Quando si utilizza this.sendAction('actionName') stai zampillante un'azione che si dovrà prendere sul componente/controller con actions

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

Se si desidera inviare che a monte della catena, si chiamare di nuovo sendAction('') sul componente/controller e riprenderlo sul genitore (e così via).

L'altro approccio this.get('action')() utilizza le azioni di chiusura, che sono normali funzioni javascript. Questi sono il modo preferito per richiamare azioni in Ember 1.13.X per quanto ne so. Una cosa chiara che le azioni di chiusura hanno è che puoi avere valori di ritorno. Il che significa che si può avere qualcosa di simile:

//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 
    }); 
    } 
} 

Molto può essere scritto circa le azioni di chiusura, ma altri hanno scritto di gran lunga meglio di me, quindi vi consiglio i seguenti articoli:

E se sei nuovo di tutto il concetto DDAU (Data Down Actions Up), ti consiglio veramente il Sam's article del concetto in generale.

Aggiornamento: C'è anche un addon (collegato nei commenti da @locks) che consente closure actions to bubble to routes.

+0

Grazie per questa eccellente risposta! Verificherà gli articoli. :) Molte grazie! – maximusmusterus

+0

Contento di aver potuto aiutare. Ho anche faticato ad imparare questi concetti! Buona fortuna con il tuo aiuto brace. –

+0

Grazie! L'unico svantaggio è che non posso usare {{my-component onSomething = (action 'theAction')}} quando 'theAction' è definito all'interno del percorso. Quindi o devo usare un controller (sarà deprecato per quanto ne so) o avvolgere tutto in un componente aggiuntivo. Al momento volevo gestire azioni specifiche del modello (modifica, creazione) a livello di percorso. – maximusmusterus

Problemi correlati