Iron-Router RouteController继承:为什么父控制器的Hook在Child之前运行?

时间:2014-06-20 01:28:01

标签: meteor iron-router

我一直在为流星(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运行?

1 个答案:

答案 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常用功能的操作。