Meteor Flow Router - вложенные динамические шаблоны
Я пытаюсь сделать динамический шаблон внутри динамического шаблона.
Основной макет:
<template name="template1">
{{>navbar}}
<div class="container">
{{>Template.dynamic template=content}}
</div>
</template>
Sub-шаблон:
<template name="template2">
<div class="container">
<div class="row">
<h2>Data Input</h2>
</div>
<div class="row">
<ul class="nav nav-pills">
<li class="active"><a href="/input/inc">Inc</a></li>
<li><a href="/input/exp">Exp</a></li>
</ul>
</div>
<div class="row">
{{>Template.dynamic template=dataSection}}
</div>
</div>
Суб-суб-шаблон:
<template name="template3">
<h2>Inc</h2>
</template>
Ниже мой код FlowRouter. Это неправильно, но я подумал, что это может дать кому-то представление о том, что я пытаюсь сделать. FlowRouter:
FlowRouter.route('/input/income', {
action: function () {
BlazeLayout.render("template1", {
content: "template2"
});
BlazeLayout.render("template2", {
dataSection: "template3"
});
}
});
Я пытаюсь отобразить template2 внутри template1, а затем после этого я хотел бы отобразить шаблон 3 внутри шаблона 2. Нужно ли каким-то образом отображать шаблон 3 внутри шаблона 2, прежде чем я смогу отобразить этот шаблон внутри Template1?
2 ответа
Вы захотите визуализировать суб-шаблон с помощью помощника. Измените код вашего маршрутизатора на:
action: function () {
BlazeLayout.render("template1", {
content: "template2"
});
}
Вам нужен только один вызов render, потому что template2 автоматически отобразит данный динамический шаблон. Теперь в template2 создайте помощника:
Template.template2.helpers({
dataSection() {
return "template3";
}
});
Вы можете заменить инструкцию return другой логикой, если хотите, если она возвращает имя шаблона.
Вы также можете сделать это без помощника шаблона:
BlazeLayout.render('App_Body', {main: 'parent', sub: 'details' });
HTML для основного шаблона
<template name="App_body">
{{> Template.dynamic template=main}}
</template>
HTML для родительского шаблона
<template name="parent">
Parent template
{{> Template.dynamic template=sub}}
</template>
HTML для суб-шаблона
<template name="details">
Sub template
</template>
Глубокая связь с маршрутами становится намного проще:
FlowRouter.route('/todos/show/:id', {
name: 'Todo.show',
action(params, queryParams) {
BlazeLayout.render('App_body', {main: 'parent', sub: 'details' });
}
});
И тогда в детали JS части шаблона вы можете получить идентификатор:
Template.todo.onCreated(function todoOnCreated() {
var id = FlowRouter.getParam('id');
// ...
});