Nutritioustim
Nutritioustim

Reputation: 2738

Backbone Router confusion on howto trigger

I can't seem to get the Backbone Router working in an expected manner. I i) instantiate my Router, then ii) call Backbone.history.start( { pushState: true, root: '/' } ). With the code below...

    Router : Backbone.Router.extend

        routes:
          "dashboard":                  "dashboard"
          "grid/:storyid":              "grid"

        dashboard: ->
          console.log("...")

        grid: (storyid) ->
          console.log("...")

What do I need to do to get cases 1) and 2) to work?

Thanks

Upvotes: 0

Views: 213

Answers (1)

Derick Bailey
Derick Bailey

Reputation: 72868

Your router is working exactly as it's supposed to. I think your expectations of how it works, and why, are off.

1) going to "/dashboard" or "/grid", the defined functions are not called

When you type "/dashboard" or "/grid" in to your browser's URL bar, your browser makes a request to your server to get that url. This bypasses the router because the browser is making the request back to the server.

The only time typing a URL in to the browser's URL input would not request a new page from the server, is when you are only modifying the hash fragment: "#whatever".

when I invoke myrouter.navigate("grid"), the defined functions are not called

The default behavior of router.navigate is to update the URL w/ the appropriate route, but not that route to be handled by the router - exactly what you are describing.

If you want to force the browser to process the route change, pass true as a second argument: myrouter.navigate("grid", true)

**) However, if I then go back or forwards throught the history, then the defined functions are called.

This works because the router has registered itself w/ the browsers history API and is given the opportunity to handle the URL changes that are caused by the fwd / back buttons, before the browser goes back to the server to get the requested URL.

Upvotes: 1

Related Questions