模板最初为空,但在更改和返回路线时正确呈现

时间:2014-12-05 18:58:45

标签: meteor iron-router

我有一个名为profile的模板,其中包含三个其他模板。其中一个模板是{{> postlist}}

此模板的辅助函数是

Template.postlist.helpers({
posts: function() {
return Posts.find({rph: {$in : postsArr}});
}
});

问题是要去路线,postlist模板是空的,因为postArr是在dom基于其他两个模板加载后计算的。但是,如果我点击其他路线并返回到此路线,模板将正确呈现。

我该怎么做才能让模板最初正确呈现?

1 个答案:

答案 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了解更多详情。