我有一个名为profile的模板,其中包含三个其他模板。其中一个模板是{{> postlist}}
此模板的辅助函数是
Template.postlist.helpers({
posts: function() {
return Posts.find({rph: {$in : postsArr}});
}
});
问题是要去路线,postlist模板是空的,因为postArr是在dom基于其他两个模板加载后计算的。但是,如果我点击其他路线并返回到此路线,模板将正确呈现。
我该怎么做才能让模板最初正确呈现?
答案 0 :(得分:1)
最简单的方法是Session
,但它可能是最糟糕的选择:
Template.postlist.helpers({
posts: function() {
return Posts.find({rph: {$in : Session.get('postsArr') }});
}
});
如果您现在在代码中的任何位置拨打Session.set('postArr', ...)
,posts
帮助程序将自动更新。第二种选择是使用共享的反应变量:
var postsArr = new ReactiveVar();
然后在你的助手里面:
return Posts.find({rph: {$in : posts.Arr.get() }});
现在你可以做postsArr.set(...)
,一切都应该正常。只记得meteor add reactive-var
做你的项目。
最后一个疑问是:在哪里放置反应变量声明?在大多数情况下,您可以放弃使用单个"控制器"文件。它只会工作: - 您一次只有一个模板实例 - 设置广告获取反应变量值的代码可以放在同一个文件中
如果上述条件之一不成立,那么唯一可行的选择就是将状态变量放在模板的范围内。你就是这样做的:
Template.postsList.created = function () {
this.postsArr = new ReactiveVar();
};
Template.postlist.helpers({
posts: function() {
return Posts.find({rph: {$in : Template.instance().postsArr.get() }});
}
});
从帮助程序中,您始终可以使用postsArr
例程访问Template.instance()
,该例程始终返回调用帮助程序的当前模板实例。从事件处理程序中,请注意,处理程序的第二个参数始终是您感兴趣的模板实例。
如果您需要从其他模板访问它,那么您应该将状态变量放在相应的路径控制器上。假设您正在使用iron-router
,那就是:
Iron.controller().state.get('postsArr');
Iron.controller
例程授予您访问当前路径控制器的权限。 Read this了解更多详情。