【问题标题】:How can I change behavior of Meteor template events on an included template?如何在包含的模板上更改 Meteor 模板事件的行为?
【发布时间】:2015-05-08 20:58:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript templates meteor


    【解决方案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 的回答。

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2014-05-14
      • 2020-04-07
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 2017-06-12
      • 2012-08-15
      • 1970-01-01
      相关资源
      最近更新 更多