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 循环内设置变量?