Наследяване на RouteController на Iron-Router: Защо куката на родителския контролер се изпълнява преди тази на детето?

Работих с фантастичния пакет Iron-Router (0.7.1) за Meteor (0.8.1.3) и попаднах на нещо, което изглежда донякъде контраинтуитивно. Дадох пример по-долу.

Следният код е написан в контекста на предоставените от 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');

Тестът доведе до това, че Детето отпечата „Аз съм в родителя“, очаквах Детето да отпечата „Аз съм в детето“

Чувствам, че с обектно-ориентираното програмиране би било по-естествено onBeforeAction на Child да замени този на Parent.

Като се има предвид това, ако това е умишлено, как мога да подкопая реда на куките и да се изпълнява само onBeforeAction на детето?


person erhlee.bird    schedule 20.06.2014    source източник


Отговори (1)


Изглежда, че е умишлено:

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;
};

Ако не искате родителската кука да се изпълнява, изглежда, че ще трябва да пропуснете използването на наследяване и да направите нещо като смесване на обща функционалност в различните контролери.

person Dave Bryand    schedule 10.09.2014