Search code examples
ember.jsember-router

How Can The Current Route Be Observed for Changes?


I want to update the <title> tag for the page whenever the location (route) changes. I'm particularly interested in observing App.Router's current route changing - I then want to access the View associated with that route and update the <title> tag from the observer based on a property of the View.

For example, if going to /about

  1. What do I set the Observer to observe? I'm having trouble finding a currentState property or equivalent to observe.
  2. Within the Observer, how can I access the App.AboutView associated with the route?

I'm using 1.0.0pre4


My goal is to have a title property and an authorization property on each View that the Observer on currentPath will work with. I want to use the title property to update the document.title, and the authorization property object to check wither my current user can access the route.

Now that I say this and with @Michael Grassotti's answer, perhaps these properties belong on the Controller and not the View. The goal is to gain access to these properties associated with the current Route's context to modify the document.title and check whether or not my App.CurrentUserController (that stores a User object model for the logged in user) is authorized to acess the current route.


Solution

  • So the properties I'm trying to work with belong on the Controller for the route, not the View.

    Given some contactUs route, it's Controller might look like

    App.ContactUsController = App.AppController.extend({
      title: "Contact Us"
    });
    

    My App.ApplicationController can now look like

    App.ApplicationController = Ember.Controller.extend({
      updateTitle: function() {
        window.document.title = this.controllerFor(this.currentPath).get('title');
      }.observes('currentPath')
    });
    

    So the API methods/properties I was looking for are

    • App.ApplicationController.get('currentPath') (currently appears to be undocumented on the site)
    • controllerFor (also seems undocumented, but is found within a reopen implementation for Ember.ControllerMixin)