Backbone 路由器事件 - 每条路由总是两个事件?
Backbone router events - always two events per route?
我正在使用较新的 Backbone 事件侦听机制。在我的路由器初始化方法中,它看起来像这样:
this.listenTo(this,'all',function(route,action){
console.log('router was invoked, route:',route,'action:',action);
});
在调试器中,当我在 console.log 语句上放置断点时,我得到了一些意想不到的东西。
对于每条新路线,我得到这个组合
route action
route:x null
route x
所以在现实生活中看起来像:
route action
route:home null
route home
route:index null
route index
所以我的问题是 - 为什么每条路线都会触发两个单独的事件,为什么它们会像上面那样不同?
这里有一些证据:
因为 Router.route
每个 route
操作触发两个单独的事件:
route: function(route, name, callback) {
if (!_.isRegExp(route)) route = this._routeToRegExp(route);
if (_.isFunction(name)) {
callback = name;
name = '';
}
if (!callback) callback = this[name];
var router = this;
Backbone.history.route(route, function(fragment) {
var args = router._extractParameters(route, fragment);
if (router.execute(callback, args, name) !== false) {
router.trigger.apply(router, ['route:' + name].concat(args));
router.trigger('route', name, args);
Backbone.history.trigger('route', router, name, args);
}
});
return this;
},
http://documentcloud.github.io/backbone/docs/backbone.html#section-152
第一个使用 router, ['route:' + name].concat(args)
调用实际触发器,第二个首先调用 route
事件。
我正在使用较新的 Backbone 事件侦听机制。在我的路由器初始化方法中,它看起来像这样:
this.listenTo(this,'all',function(route,action){
console.log('router was invoked, route:',route,'action:',action);
});
在调试器中,当我在 console.log 语句上放置断点时,我得到了一些意想不到的东西。
对于每条新路线,我得到这个组合
route action
route:x null
route x
所以在现实生活中看起来像:
route action
route:home null
route home
route:index null
route index
所以我的问题是 - 为什么每条路线都会触发两个单独的事件,为什么它们会像上面那样不同?
这里有一些证据:
因为 Router.route
每个 route
操作触发两个单独的事件:
route: function(route, name, callback) {
if (!_.isRegExp(route)) route = this._routeToRegExp(route);
if (_.isFunction(name)) {
callback = name;
name = '';
}
if (!callback) callback = this[name];
var router = this;
Backbone.history.route(route, function(fragment) {
var args = router._extractParameters(route, fragment);
if (router.execute(callback, args, name) !== false) {
router.trigger.apply(router, ['route:' + name].concat(args));
router.trigger('route', name, args);
Backbone.history.trigger('route', router, name, args);
}
});
return this;
},
http://documentcloud.github.io/backbone/docs/backbone.html#section-152
第一个使用 router, ['route:' + name].concat(args)
调用实际触发器,第二个首先调用 route
事件。