2013-04-15 6 views
6

Ich versuche, die Route zu ändern, um einige gemeinsame Aktion anzuwenden, sobald gerendert. Die Idee ist, eine Funktion ähnlich der onload zu haben, aber da wir eine Single-Page-App verwenden, muss dies bei jeder Routenänderung ausgelöst werden. (Könnte auf die neue Ansicht scoped werden)Verweisende Route ändern, um zu gelten gleich

Ich fand, wie die currentpath Änderungen zu beachten:

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

Das funktioniert zwar gut in einigen Fällen, wird es ausgelöst wird, wenn die Route ändert, aber immer noch zu früh zu Wenden Sie Inhaltsänderungen so an, wie es scheint, bevor der Inhalt gerendert wird.

Irgendeine Idee über die beste Praxis, um dieses Ziel zu erreichen?

+2

Ich habe eine Antwort hinterlassen, aber ich würde vorschlagen, dass es in vielen Fällen ein Anti-Pattern ist, wenn Sie auf die Ansichten warten müssen, um mit dem DOM zu meckern. Vielleicht gibt es einen besseren Ort, um die DOM-Manipulation, die Sie gerade machen, zu platzieren, wie das 'didInsertElement' einer Ansicht? –

+0

Wenn Sie die Ansichten implementieren, können Sie das in ['didInsertElement'] (http://emberjs.com/api/classes/Ember.View.html#event_didInsertElement) tun. – MilkyWayJoe

Antwort

12

Haben Sie versucht, den Code mit Ember.run.schedule zu verzögern? Zum Beispiel

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

Vielen Dank! Das hat für mich funktioniert. – John

0

Aufgrund der deprecation of Controllers in Ember 1.x die URL im Router zu finden, wäre ein guter Weg, um zukunftssicher Ihre Anwendungen sein. Sie können dies wie so in ember-cli tun:

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

Dieses log wird: /posts und /posts/3/comments ect.

+0

Auf der Seite "Veraltet" wird nicht erwähnt, dass Controller veraltet sind. Nur 'ArrayControllers' und' ObjectControllers', aber nicht alle Controller. – mikefrey

+0

Das stimmt, aber ich denke, dass diese Logik irgendwann in einer routbaren Komponente oder einer Route enden sollte. Du kannst derzeit (1.13.6) einen "Controller" ohne jegliche Verwarnungswarnungen verwenden, aber ich denke, dass sich das in Ember 2 (derzeit in der Betaversion) ändern kann. –