如何在包含的模板上更改Meteor模板事件的行为?

时间:2015-04-24 17:11:14

标签: javascript templates meteor

我有一个显示帖子表的模板。用户可以编辑,添加和删除帖子。我的网站有两种不同的帖子:它有一个共享的帖子库,每个用户都有帖子附加到他们的个人资料。

Articles table

我的表格在网站上是相同的,但CRUD操作因显示用户的帖子或网站的共享帖子库而有所不同。例如,当用户添加帖子时,我需要运行Meteor.users.update({_id: [user ID]}, {$push: {'profile.posts': postObject}})。当网站管理员添加帖子时,我需要运行Articles.insert(postObject)

最好的方法是什么?我尝试将参数传递给我的模板包含(即{{> postsTable source=Articles}})并在事件函数中测试它,但似乎替换数据上下文,这意味着我的模板无法再访问这些帖子。我还考虑过测试当前路由并使用它来分支事件函数,但这种方法看起来有点臭。

或者,我可以为包含表的模板而不是表模板本身绑定事件。这可能是最简单的解决方案,但是当改变的唯一方法是如何存储结果数据时,我会在这些不同的模板中复制大量代码。

1 个答案:

答案 0 :(得分:1)

我同意使用current route是令人不快的担忧。我承认我们会在几个地方的应用中解决这个问题。

如果可能,我建议修改所包含的postTable模板的上下文。你有几个选择:

重命名上下文并添加更多变量

{{> postsTable data=this isArticles=true}}

现在您的postsTable可以访问父上下文和isArticles布尔值。唯一的技巧是你需要通过data命名空间(或你选择调用它的任何东西)来访问上下文,这看起来有点冗长。

在帮助程序中扩展上下文

向父模板添加一个帮助器,扩展其上下文,如下所示:

Template.parentTemplate.helpers({
  context: function() {
    var result = _.clone(this);
    result.isArticles = false;
    return result;
  }
});

然后在你的模板中你可以这样做:

{{> postsTable context}}

您的postsTable模板将具有父上下文以及isArticles布尔值。这是我们喜欢的技术。

如果您更愿意使用全球帮助者,请参阅我对this question的回答。