Наследование шаблонов урожая от суперконтроллера с железным маршрутизатором

У меня есть суперконтроллер: ApplicationController, который уступает моим областям: верхний/нижний колонтитул. Когда один из моих настроенных маршрутов пытается перейти в другой регион в другом шаблоне, yieldTemplates родительского контроллера переопределяются.

Пример:

   ApplicationController = RouteController.extend({
    yieldTemplates: {
        'footer': { to: 'footer' },
        'header': {to: 'header'}
    }
});

var SignUpController = ApplicationController.extend({
    template: 'signUp'

});

Router.map(function () {


    this.route('signup', {
        path: '/sign-up',
        controller: SignUpController,
        template: 'signUp-form',
        disableProgress: true,
        yieldTemplates: {
            'personal-signup': {to: 'signup-detail'}
        }
    });
});

Любая идея, почему наследование не работает в этой ситуации?


person Warz    schedule 23.02.2014    source источник


Ответы (2)


У меня была похожая проблема, прочитайте ответ здесь: https://github.com/EventedMind/iron-router/issues/249#issuecomment-27177558

Происходит то, что ваша конфигурация уровня маршрутизатора переопределяет прототип RouteController. Как правило, параметры переопределяют свойства прототипа в iron-router.

Простое решение — создать глобальный объект с основными выходами, а затем расширить этот объект на каждом контроллере, когда потребуются новые выходы:

var mainYieldTemplates = {
    'footer': { to: 'footer' },
    'header': {to: 'header'}
};

ApplicationController = RouteController.extend({
    yieldTemplates: mainYieldTemplates
});

var SignUpController = ApplicationController.extend({
    template: 'signUp',
    yieldTemplates: _.extend({}, mainYieldTemplates, {
            'personal-signup': {to: 'signup-detail'}
        }
    )
});

Router.map(function () {
    this.route('signup', {
        path: '/sign-up',
        controller: SignUpController,
        template: 'signUp-form',
        disableProgress: true,
    });
});

В вашем коде также есть небольшое несоответствие, когда вы объявляете свойство «шаблон» как «signUp» в контроллере, но затем в самом маршруте вы устанавливаете его как «signUp-form». Это перезапишет свойство «шаблон» в контроллере. Вместо этого вы можете создать новый контроллер для каждого маршрута со всеми свойствами маршрута, а не перезаписывать их.

person FredericoC    schedule 24.02.2014
comment
Мне нравится этот подход, с одной вариацией и одной оговоркой: вместо определения глобального объекта mainYieldTemplates (и в этом нет ничего плохого), я думал сослаться на прототип __super__ SignUpController в _.extend, но это не работает. Я могу заменить mainYieldTemplates на ApplicationController.yieldTemplates, но не SignUpController.__super__.yieldTemplates. Есть идеи, почему? Обратите внимание, что SignUpController.__super__.data.call(this) отлично работает в методе data, поэтому я не знаю, почему он не работает в свойстве yieldTemplates. - person fulv; 29.07.2015

Мне надоело использовать решение в другом ответе, и я просто закончил тем, что обезьяна исправила RouteController, чтобы он вел себя так, как я ожидал в этом случае. Отлично работает до сих пор.

(function(){
  var orig = RouteController.extend;
  RouteController.extend = function(newChild) {
    var extendedTemplates = {};
    if (!newChild.yieldTemplates) {
      newChild.yieldTemplates = {};
    }
    _.extend(extendedTemplates, this.prototype.yieldTemplates);
    _.extend(extendedTemplates, newChild.yieldTemplates);
    newChild.yieldTemplates = extendedTemplates;
    return orig.apply(this, arguments);
  }
})();

Бросьте этот код куда-нибудь, прежде чем создавать свои собственные RouteController. Любые дальнейшие контроллеры, расширенные оттуда, будут распространяться на поле yieldTemplates родителя.

person iameli    schedule 06.05.2015