2013-04-15 20 views
6

Próbuję obserwować zmianę trasy, aby zastosować pewną wspólną akcję po wyrenderowaniu. Chodzi o to, aby mieć funkcję podobną do onload, ale ponieważ używamy aplikacji z jedną stroną, musi ona zostać uruchomiona przy każdej zmianie trasy. (Może być zawężona do nowego widoku)Zmiana trasy objazdowej w celu zastosowania równoważnego do obciążenia

znalazłem jak obserwować zmiany currentPath:

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

Chociaż to działa dobrze w niektórych przypadkach robi wyzwalane, gdy zmienia się trasa, ale jeszcze za wcześnie, aby zastosować zmiany zawartości, które wydają się dołączać, zanim treść zostanie wyrenderowana.

Czy masz pomysł na najlepszą praktykę, aby osiągnąć taki cel?

+2

Zostawiłem odpowiedź, ale sugerowałbym, że w wielu przypadkach jest to anty-wzorzec, jeśli trzeba czekać na wyświetlenia, aby pozbyć się DOM. Być może jest lepsze miejsce do umieszczania manipulacji DOM, co robisz, np. 'MadeInsertElement' niektórych widoków? –

+0

Jeśli implementujesz widoki, możesz to zrobić w ['didInsertElement'] (http://emberjs.com/api/classes/Ember.View.html#event_didInsertElement) – MilkyWayJoe

Odpowiedz

12

Czy próbowałeś odłożyć kod na Ember.run.schedule? Na przykład,

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

Dzięki! To działało dla mnie. – John

0

powodu deprecation of Controllers in Ember 1.x znalezienia adresu URL w routerze byłoby dobrym sposobem na przyszły dowód aplikacji. Można to zrobić w ember-cli tak:

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

Będzie to log: /posts i /posts/3/comments ect.

+0

Strona wycofania nie wspomina o tym, że kontrolery są przestarzałe. Tylko 'ArrayControllers' i' ObjectControllers', ale nie wszystkie kontrolery. – mikefrey

+0

To prawda, ale myślę, że ostatecznie ta logika powinna zakończyć się albo komponentem rutowalnym, albo trasą. Możesz obecnie (1.13.6) używać 'Kontrolera' bez żadnych ostrzeżeń o wycofaniu, jednak myślę, że może się to zmienić w Ember 2 (obecnie w wersji beta). –