2013-07-26 11 views
12

Vedo molti esempi confusi nei tutorial ufficiali di Ember.js.Ember.js Qual è la differenza tra setupController e la dichiarazione di un controller <Name>

Un esempio che davvero non mi piace è:

App.ApplicationRoute = Ember.Route.extend({ 
     setupController: function(controller) { 
     controller.set('title', "Hello world!"); 
    } 
}); 

App.ApplicationController = Ember.Controller.extend({ 
    appName: 'My First Example' 
}); 

Ora se ho capito bene avrei potuto scrivere in quel modo, invece:

App.ApplicationController = Ember.Controller.extend({ 
     appName: 'My First Example', 
     title: 'Hello world!' 
    }); 

e la rimozione di questo setupController da percorso.

Qual è lo scopo/vantaggio dell'utilizzo di setupController?

risposta

20

setupController è principalmente per la configurazione dinamica di alcuni contesti controller. Nel tuo esempio, se il titolo sarà sempre "Ciao mondo!" va bene impostarlo in una dichiarazione di classe.

Per impostazione predefinita, setupController imposterà la proprietà model di controller sul valore restituito dal gancio model del percorso.

È anche possibile, ad esempio, impostare il modello di un altro controller o impostare uno stato del controller iniziale che dipende dal modello.

Ad esempio, si supponga di avere il seguente:

// Model 
App.Post = DS.Model.extend({ 
    title: DS.attr('string'), 
    text: DS.attr('string'), 
    autoEdit: DS.attr('string') 
}); 

// Controller 
App.PostController = Ember.ObjectController.extend({ 
    isEditing: null, 
    toggleEdit: function() { this.toggleProperty('isEditing'); } 
}); 

Template:

<a href="#" {{action 'toggleEdit'}}>Toggle edit mode</a> 

{{#if isEditing}} 
    {{input type="text" value=title placeholder="Title"}} 
    {{textarea type="text" value=text placeholder="Text"}} 
{{else}} 
    <h1>{{title}}<h1> 
    <article>{{text}}</article> 
{{/if}} 

E poi, si decide che sarebbe bello per attivare la modalità di modifica per impostazione predefinita per i messaggi con autoEdit uguale a true. Probabilmente si vorrà fare che nel percorso (in quanto il controller, quando un'istanza, non sa nulla del modello):

App.PostRoute = Ember.Route.extend({ 
    setupController: function(controller, model) { 
    this._super(controller, model); 
    if (model.get('autoEdit')) { 
     controller.set('isEditing', true); 
    } 
    } 
}); 

Quindi, fondamentalmente, è per "l'inizializzazione" del regolatore (impostazione di modello e di default dello stato) .

+0

Non capisco perché il contesto dinamico non possa essere gestito in un controllore dichiarato di classe, puoi darmi ed esempio. – Canttouchit

+0

Perché quando il controller viene istanziato, inizialmente non esiste alcun modello, quindi non è possibile impostare correttamente alcuni stati di default se dipende dagli attributi del modello. –

+0

Ancora posso impostare i hook del modello nel percorso, ancora non capisco. Route è il rendering del modello sul controller perché è importante se lo cambio da 'setupController' o dalla classe controller – Canttouchit

Problemi correlati