2016-06-16 3 views
3

При переносе на новый проект Meteor, который заменял Iron-Router Flow-Router, я действительно упустил функциональность Iron-Router, чтобы определить поведение и настройки по умолчанию, которые можно было бы использовать во всем мире ,Хороший способ определения шаблонов рендеринга по умолчанию в FlowRouter

Я понимаю, что Flow-Router использует конструкцию «group», чтобы иметь возможность определять события крюка по умолчанию, которые могут применяться к любому маршруту, прикрепленному к этой группе, но, казалось, ничего не было доступно для определения шаблонов по умолчанию.

Каков наилучший способ реализации этого типа функции глобального или группового шаблона по умолчанию?

ответ

1

ОБНОВЛЕНО НИЖЕ:

Я работал, что я думаю, что это довольно эффективный и эффективный способ сделать это.

При рассмотрении функциональности Flow-маршрутизатор, я заметил, что объект маршрутизатор включает в себя поле, которое содержит все параметры группы, в FlowRouter.current().route.group.options

Этот объект содержит любую пару ключ-значение, определенное в группе, независимо от того, они используются API Flow-Router или нет.

Тогда я решил использовать это как простой способ передачи некоторых шаблонов по умолчанию из группы в маршрутизатор.

первых, это определение группы:

var mainRoutes = FlowRouter.group({ 
    name: "mainRoutes", 
    defaultTemplates: { 
    menu: "mainMenu", 
    breadcrumb: "mainCrumb", 
    sidebarLeft: "sidebarLeft", 
    sidebarRight: "sidebarRight", 
    footer: "mainFooter" 
    } 
}); 

Тогда при определении маршрута мы можем получить доступ к этим из this.group.options.defaultTemplates

mainAppRoutes.route('/', { 
    name: "home", 
    action: function() { 
    // Get the defaultTemplates object 
    var templates = this.group.options.defaultTemplates; 
    // Add route specific templates 
    templates.content = "homeScreen"; 
    // Pass all the templates to the renderer 
    BlazeLayout.render("appLayoutMain", templates); 
    } 
}); 

Мне нравится этот шаблон, потому что он использует существующие возможности Flow-маршрутизатора и одна дополнительная строка кода в маршруте, позволяющая определять стандартные шаблоны по умолчанию. Это, по сути, имитирует, как Iron-Router использовал шаблоны по умолчанию в Router.config(), с дополнительным преимуществом определения шаблонов локального маршрута, не переписывая весь объект шаблона по умолчанию.

  • UPDATE выше работает хорошо для меня, хотя я в конечном итоге having another problem, который я должен был решить, чтобы заставить его работать последовательно.

По существу, если вы измените любые основные «маршрут по умолчанию», как мы делаем, в локальной route.action функции, так как Flow-маршрутизатор не является реактивным, объект маршрутизатора группы, похоже, сохранится от маршрута к маршруту, как долго поскольку маршруты находятся в одной группе. Также этот объект «options» передается маршрутизатору из определения маршрута. Так что это означает, что если вы переопределите параметр по умолчанию в приведенном выше случае, он будет перезаписан для всех последующих маршрутов с использованием той же самой группы после того, как будет вызван маршрут, который переопределяет его.

Решение, с которым я столкнулся, состояло в том, чтобы выполнить функцию сброса по умолчанию: triggersExit: [ resetDefaults ] в определении группы.

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

function resetDefaults (context) { 
    context.route.group.options.defaultLayoutTemplate = "mainAppLayout"; 
    context.route.group.options.defaultTemplates = { 
    defaultTeamplates: "navMain", 
    // ... 
}; 
+0

В качестве короткой заметки для доступа к родительскому элементу в вложенных шаблонах вы можете получить доступ к родительскому элементу вложенной группы через 'FlowRouter.current(). Group.parent.options.defaultTemplates' – robertdavid

2

Я решил использовать простую абстракцию, которая позволила бы моделировать эту особенность Iron-Router. Я пытаюсь оценить, является ли это звуковой и расширяемой моделью, прежде чем я буду рассматривать более непосредственную интеграцию такой функции в самой FlowRouter, а также поделиться этой идеей с другими, которые ищут аналогичное решение.

Я просто создал объект, который используется в качестве шаблона объекта параметра, который изменяется по мере необходимости, а затем передается при вызове BlazeLayout.render.

Это то, что routes.js может выглядеть следующим образом:

var appRouteGroup = FlowRouter.group({ 
    name: "appRouteGroup", 
    triggersEnter: [sometrigger] 
}); 

var appRouteTemplates = { 
    menuMain: "appNav", 
    footerMain: "appFooter" 
}; 

appRouteGroup.route("home", { 
    name: "home", 
    action: function() { 
    // We get the default templates 
    var templates = appRouteTemplates; 

    // Now we can add the route specific template 
    templates.content = "homePage"; 

    // Then render with templates passed through the object param 
    BlazeLayout.render("mainLayout", templates); 
    } 
}); 

Это позволит затем рендерить шаблоны группы по умолчанию, без необходимости переопределять их для каждого маршрута. И с шаблоном разметки следующим образом:

<template name="mainLayout"> 
    {{>Template.dynamic template=menuMain}} 

    {{>Template.dynamic template=content}} 

    {{>Template.dynamic template=footerMain}} 
</template> 

Я ищу способ, возможно, сделать более прямую интеграцию в FlowRouter, но это кажется совершенно функциональным. Любые мысли о улучшениях?

+0

Кроме того, это позволяет локальные определения маршрутов для выборочного перезаписывать шаблоны по умолчанию, то, что железо-маршрутизатор не позволяет выборочно , – robertdavid

1

Я так хотел представить другое решение, которое я нашел, что добавляет более полный метод создания маршрутных параметров по умолчанию для Flow-router.

Он использует пакет атмосферы под названием Flow-router-tree:

Этот пакет позволяет определить маршруты в виде серии «узлы», которые могут быть связаны с «родителями» и которые затем будет наследовать параметры по умолчанию, заданных в определении этого родителя. Было бы интересно посмотреть другие комментарии по этому пакету.

Смежные вопросы