我一直在为流星(0.8.1.3)使用梦幻般的Iron-Router软件包(0.7.1),并且遇到了一些看起来有些违反直觉的东西。我在下面提供了一个例子。
以下代码是在Iron-Router提供的Tinytests的背景下编写的。 https://github.com/EventedMind/iron-router/blob/devel/test/both/route_controller.js
var Parent = RouteController.extend({
onBeforeAction: function(pause) {
console.log('I\'m in the parent!');
pause();
}
});
var Child = Parent.extend({
onBeforeAction: function(pause) {
console.log('I\'m in the child!');
pause();
}
});
var inst = new Child(Router, route, {});
inst.runHooks('onBeforeAction');
测试导致孩子打印出来了#34;我在父母的身上" 我原本希望孩子打印出来#34;我在孩子身上"
我觉得使用面向对象编程,对于孩子的onBeforeAction来说覆盖父母会更自然。
话虽如此,如果这是故意的,我怎么能颠覆钩子的顺序并且只让孩子的onBeforeAction运行?
答案 0 :(得分:2)
看起来是有意的:
https://github.com/EventedMind/iron-router/blob/devel/lib/route_controller.js#L97
// concatenate together hook arrays from the inheritance
// heirarchy, starting at the top parent down to the child.
var collectInheritedHooks = function (ctor) {
var hooks = [];
if (ctor.__super__)
hooks = hooks.concat(collectInheritedHooks(ctor.__super__.constructor));
return Utils.hasOwnProperty(ctor.prototype, hookName) ?
hooks.concat(ctor.prototype[hookName]) : hooks;
};
如果您不希望父钩子运行,看起来您将不得不跳过使用继承并在各种控制器中执行类似mixin常用功能的操作。