给定URL哈希字符串,请求AppRouter解析指定的控制器方法

时间:2015-01-22 13:22:06

标签: marionette

我有一个AppRouter和一个控制器。现在在此链接上<a class="myLink" href="#foo/123">link</a>我不希望更改浏览器网址,所以

$('.myLink').click( function (evt) {
  evt.preventDefault();

  //  do something else
  //  ...

  var href = $(this).attr('href');  // #foo/123
  // now I want to use AppRouter/Controller to do as they are designed to.
}); 

var MyRouter = Backbone.Marionette.AppRouter.extend({
  appRoutes: {  "foo/:id": "doFoo" }
});

App.on('before:start', function () {
  App.router = new myRouter({
    controller: new myController()
  });
});

问题:有一个字符串#foo/123(不在浏览器的URL栏上)是否可以要求路由器解析控制器方法doFoo

或告诉路由器直接调用doFoo而不告诉我doFoo

2 个答案:

答案 0 :(得分:0)

是的,但你可能不应该这样做。更好的途径是使用事件。

这就是你建议你做的事情:

var x = "foo/123";
_.select(Backbone.history.handlers, function(handler) {
  return handler.route.test(x);
});

这是一条更好的路线:

$('.myLink').click( function (evt) {
  evt.preventDefault();
  App.vent.trigger("do controller handler");
});

controller.listenTo(App.vent, "do controller handler", controller.handler);

答案 1 :(得分:0)

Andrew Hubbs回答了这个问题:&#39;解决指定的控制器方法&#39;

对于后续问题&#39;如何运行找到的方法&#39; ,这里是答案延伸Andrew Hubbs&#39;

var href = "foo/123";   // url hash, after #

// _.find returns the first match
var handler = _.find(Backbone.history.handlers, function(handler) {
  return handler.route.test(href);
});

if ( !!handler ) {
  handler.callback.apply( null, handler.route.exec(href) );
}

为什么为null:
Null是&#39;这个&#39;的价值。提供了对回拨的电话&#39;。见Function.prototype.apply()

不知道&#39;这个&#39;应该。给空作品。省略它会导致js错误:Cannot read property 'slice' of null