我有一个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
?
答案 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