Iron-Router 模板内的上下文

Posted

技术标签:

【中文标题】Iron-Router 模板内的上下文【英文标题】:Context inside templates with Iron-Router 【发布时间】:2014-01-25 10:20:41 【问题描述】:

我无法准确地理解在 Meteor 使用 Iron-Router 调用的模板中可以用作我的上下文的内容 - 以及这些内容如何继承。

以下是我能想到的“我可以在双花括号内引用的东西”的所有潜在来源:

内置助手 Handlebars.registerHelper(...) Template.myTemplate.myVar/myHelper = ... Template.myTemplate.helpers( ... ) data: ... 内部路由(Router.map) 和#each有什么关系? 和#with有什么关系?

我忘记了什么吗?有没有全局变量?

我想我对首先给模板提供上下文的标准方法有点困惑。还有关于控制结构内部发生的事情,例如#each#with

澄清一下就好了!

【问题讨论】:

【参考方案1】:

IronRouter 将 RouteController.data 的结果作为当前数据上下文呈现您的模板。

<template name="viewPost">
   <div>
        <h1>title</h1>
        <p>content</p>
    </div>
</template>

var PostsController=RouteController.extend(
    template:"viewPost",
    waitOn:function()
        return Meteor.subscribe("postsById",this.params._id);
    ,
    data:function()
        return Posts.findOne(this.params._id);
    
);

this.route("viewPost",
    path:"/posts/:_id",
    controller:PostsController
);

在此示例中,IronRouter 将呈现“viewPost”模板,其中包含 this.params._id 作为数据上下文的帖子。

首先为模板提供上下文的标准方法是什么?

有两种方式:

#with myContext
    > myTemplate
/with

> myTemplate myContext

如您所见,#with 控制结构设置当前数据上下文。 #each 结构迭代游标(或数组)并将当前数据上下文设置为当前获取的文档(或当前单元格)。

<template name="postsList">
    #each posts
        <h1>title</h1>
    /each
</template>

Template.postsList.helpers(
    posts:function()
        // cursor
        return Posts.find();
        // array
        return [title:"Title 1",title:"Title 2",title:"Title 3"];
    
);

更新:您能否添加关于继承的注释?例如,如果我嵌套了#each 块,变量级联吗?

我想出了这个例子:

<template name="parent">
    <ul>
        #each parentContexts
            > child
        /each
    </ul>
</template>

<template name="child">
    <li>
        <ul>
            #each childContexts
                > content
                <p>../this.parentProperty = ../this.parentProperty</p>
            /each
        </ul>
    </li>
</template>

<template name="content">
    <li>
        <p>this.childProperty = this.childProperty</p>
        <p>this.parentProperty = this.parentProperty</p>
    </li>
</template>

Template.parent.helpers(
    parentContexts:function()
        return [
            parentProperty:"parent 1"
        ,
            parentProperty:"parent 2"
        ];
    
);

Template.child.helpers(
    childContexts:function()
        return [
            childProperty:"child 1"
        ,
            childProperty:"child 2"
        ];
    
);

如果您运行此示例,您会注意到您无法访问“内容”中的 parentProperty,因为默认的 #each 帮助程序使用提供的新上下文覆盖了父数据上下文。

您可以使用以下语法访问嵌套的#each 块中的 parentProperty:../this.parentProperty,这让人想起 UNIX 父目录访问语法。

但是,您不能在“内容”模板中使用此语法,因为它与调用它的每个嵌套结构无关:您只能在实际嵌套的模板中使用 ../../parent 语法发生。

如果我们想访问内容模板中的 parentPropery,我们必须用父上下文扩充当前数据上下文。

为此,我们可以像这样注册一个新的#eachWithParent 助手:

Handlebars.registerHelper("eachWithParent",function(context,options)
    var parentContext=this;
    var contents="";
    _.each(context,function(item)
        var augmentedContext=_.extend(item,parentContext);
        contents+=options.fn(augmentedContext);
    );
    return contents;
);

现在,如果您用这个新的帮助器替换嵌套的#each,您将可以访问“内容”中的 parentProperty。

【讨论】:

感谢您的回答。您能否添加有关继承的注释?例如,如果我嵌套了#each 块,变量是否级联? 我已经更新了我的帖子,它回答了你的问题吗? 一个小知识:在外部模板上定义的模板助手不会在嵌套模板中继承(当然)。 是否可以在#each 中使用@root 来访问父上下文?

以上是关于Iron-Router 模板内的上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Meteor 模板助手编辑 Iron-Router 中作为参数传递的值?

如何在 Django 2.1 中的模板内的 for 循环内设置变量?

WPF - 在列表框中上下拖放数据模板

更改 ruby​​ 块内的上下文/绑定

如何将上下文菜单项添加到FlowDocumentScrollViewer内的textBox

***或查看器类型内的 GraphQL 查看器上下文查询?