使用Meteor Iron路由器时传递上下文

时间:2013-12-27 01:55:13

标签: meteor iron-router

我开始在我的Meteor应用程序中使用Iron Router,并使用yields进行模板化。
我最近遇到了一个问题,我无法用上下文启动命名的yield,如下所示:

{{#with context}}
    {{yield 'subtemplate'}}
{{/with}}

并收到此错误Sorry, couldn't find a yield named "subtemplate". Did you define it in one of the rendered templates like this: {{yield "subtemplate"}}?

如果我删除{{#with}}块表达式,我可以渲染产量。

有没有人知道将上下文传递给命名的yield的好方法?

我已在iron-router github项目中将我的问题发布为an issue,但尚未获得任何解决方案。

感谢任何帮助。

2014年1月1日编辑: 所以我的代码看起来像这样:

// main template for the route
 <div class="form-container">
    <div class="form">
        {{yield 'section'}}
    </div>
</div>

获得yield部分显示的逻辑

// router.js
ApplyController = RouteController.extend({
    before: function() {
        var section = this.params.section || 'personal-info';
        Session.set('current', section);
    },
    action: function() {
        var section = Session.get('current');
        this.render();
        this.render(section, {
            to: 'section'
        });
    },
    data: function() {
        return {
            app: Applications.findOne({user: Meteor.userId()})
        }
    }
});

其中一个部分模板的示例:

<template name="education">
    {{#with app}}
    <form id="education" name="education" class="fragment" method="post" action="">
    <h2>Education</h2>
        <div class="form-group">
            <label for="college" class="control-label">College/ University</label>
            <select class="form-control" id="college" name="college" placeholder="Select a College/ University">
                <option value="">Select a College/ University</option>
            {{#each colleges}}
                <option value="{{slug}}" {{selected slug ../college}}>{{name}}</option>
            {{/each}}
            </select>
        </div>
        <!-- other content here -->
    </form>
    {{/with}}
</template>

使用{{#with app}}块是我目前解决这个问题的方法,但因为我有10个不同的部分模板,所以我必须把它放在所有部分模板中。

1 个答案:

答案 0 :(得分:1)

使用ironrouter在路由器中传递数据上下文。你不能以这种方式传递它,因为如果你在路由器中传递路由,它将覆盖路由的数据上下文。

然而它可能适用于IronRouter的shark分支,它基于Meteor UI,因为它使用{{>yield}}代替{{yield}}

你可以使用它:

路由特定数据上下文

Router.map(function() {
    this.route('template', data: function() { return Something.find() });
});

您基本上使用data参数传递上下文。这样做可能比使用{{#with context}}更容易,因为您可以使用更多动态数据,这些数据对于每条路线都是不同的。

你可能已经尝试过了,我有点不确定它是否会转到命名的yield模板。

使用模板的普通模板助手

Template.templateInYieldName.helper = function() {
    return Something.find();
}

然后,您可以在命名的收益率中使用{{helper.name}}之类的内容。

带把手助手的全球数据上下文

如果您打算对所有路线使用数据,则可以使用Handlebars全局帮助程序。即

Handlebars.registerHelper('todaysDate', function() {
    return (new Date).toString();
});

然后在您的任何模板中使用{{todaysDate}}。您可以使用您的数据而不是日期。