azicchetti / jquerymobile-router

A router/controller for jquery mobile. Also adds support for client-side parameters in the hash part of the url. The routes handles regexp based routes. This plugin can be used alone or (better) with Backbone.js or Spine.js, because it's originally meant to replace their router with something integrated with jQM.
GNU General Public License v2.0
402 stars 69 forks source link

multiple routes matched #26

Closed stephenhandley closed 12 years ago

stephenhandley commented 12 years ago

I'm seeing multiple routes matched when they share a common prefix. Seems the first defined route should take precedence:

var router=new $.mobile.Router([
  {"#blahs_year\\?year=(\\d{4})": {handler: Controller.blahs_year, events: "bs,h"}},
  {"#blahs(?:\\?tab=(.*))?": {handler: Controller.blahs, events: "bs,h" }}
], {}, {
  defaultHandler: function(type, ui, page) {
    console.log("Unmatched route (" + type + ", " + ui + ", " + page + ")");
  },
  defaultHandlerEvents: 'bs,h'
});

I'm getting around it by changing the route hash, but I think it would be better if only a single route was matched.

azicchetti commented 12 years ago

Hi, I'm afraid this is actually a "feature". It may sound strange, but I know a few people (including myself) that use multiple matches to render different parts of the page in certain applications.

For example, content is rendered by a "list.html(?:....ecc)" regexp, while header and footer are generated through a "." regexp that matches every page.

Mobile websites may also use this technique to track page views through analytics (using a general handler for pageshow that calls _trackPageview).

However, I'm planning to add a status variable in the router, that counts how many handlers are called for the current event. In your example, the status variable would hold 0 when Controller.blahs_year is executed during beforeshow, and 1 when Controller.blahs is called. Same thing for the hide event (it's resetted to 0 when the event changes). Hope it sounds a viable solution to cover scenarios like the one you presented.

Cheers, Andrea

stephenhandley commented 12 years ago

Hi Andrea,

Thanks for the response.. I was thinking that the behavior was probably on purpose right after filing the issue. I can see how that flexibility makes sense in those cases.

As far as the router status variable goes, if its possible, I think a mobileinit configuration option would probably be cleaner for usage than a status counter (or at least in addition to). To specify only a single match being allowed, users could do something like:

 $(document).bind("mobileinit",function(){
        $.mobile.jqmRouter={
          firstMatchOnly: true
        };
    });

which would result in only the first match being dispatched to. firstMatchOnly would default to false, which would result in the current behavior.

Thanks! Stephen

azicchetti commented 12 years ago

Hi, a configuration option makes much more sense than a status variable, thank you for the idea.

I'll try to push the fix in the next few hours.

Cheers, Andrea

stephenhandley commented 12 years ago

Awesome, thanks!