2013-04-15 13 views
6

Sto cercando di osservare la modifica del percorso per applicare un'azione comune una volta eseguito il rendering. L'idea è di avere una funzionalità simile allo onload ma siccome utilizziamo un'applicazione a singola pagina, questa deve essere attivata per ogni modifica di percorso. (Potrebbe essere limitato l'ambito della nuova vista)Modifica del percorso di inversione per applicare equivalente al carico di lavoro

ho trovato il modo di osservare i cambiamenti currentPath:

App.ApplicationController = Ember.Controller.extend({ 
    currentPathDidChange: function() { 
    prettyPrint() 
    }.observes('currentPath'); 
}); 

Anche se questo funziona bene in alcuni casi, viene attivato quando i cambiamenti di rotta, ma ancora presto per applica le modifiche al contenuto che sembrano aggiungere prima che il contenuto venga reso.

Qualche idea sulle migliori pratiche per raggiungere tale obiettivo?

+2

Ho lasciato una risposta, ma suggerirei che in molti casi, in realtà, è un anti-pattern se devi aspettare le viste per distruggere il DOM. Forse c'è un posto migliore dove mettere qualsiasi manipolazione DOM che stai facendo, come il 'didInsertElement' di qualche vista? –

+0

Se implementi le viste, puoi farlo in ['didInsertElement'] (http://emberjs.com/api/classes/Ember.View.html#event_didInsertElement) – MilkyWayJoe

risposta

12

Hai provato a rinviare il codice con Ember.run.schedule? Per esempio,

App.ApplicationController = Ember.Controller.extend({ 
    currentPathDidChange: function() { 
    Ember.run.schedule('afterRender', this, function() { 
     prettyPrint(); 
    }); 
    }.observes('currentPath') 
}); 
+0

Grazie! Questo ha funzionato per me. – John

0

A causa della deprecation of Controllers in Ember 1.x trovare l'URL nel router sarebbe un buon modo per a prova di futuro le tue applicazioni. Si può fare questo in ember-cli in questo modo:

// similar to onLoad event behavior 
export default Ember.Route.extend({ 
    afterModel: function (model){ 
    Ember.run.next(() => { 
     console.log(this.get('router.url')); 
    }); 
    } 
}); 

// hacky way to get current url on each transition 
export default Ember.Route.extend({ 
    actions: { 
    didTransition: function() { 
     Ember.run.next(() => { 
     console.log(this.get('router.url')); 
     }); 
    } 
    } 
}); 

Questo registrerà: /posts e /posts/3/comments ect.

+0

La pagina di deprecazione non menziona il fatto che i controller siano deprecati. Solo 'ArrayControllers' e' ObjectControllers', ma non tutti i controller. – mikefrey

+0

È vero, ma penso che alla fine questa logica dovrebbe finire in un componente o in un instradabile. Al momento (1.13.6) puoi usare un 'Controller' senza avvisi di deprecazione, tuttavia penso che possa cambiare in Ember 2 (attualmente in beta). –