【问题标题】:Accessing template helper dictionary in Meteor event handler在 Meteor 事件处理程序中访问模板帮助器字典
【发布时间】:2015-03-13 19:02:01
【问题描述】:

在 Meteor 中,我将两个对象从我的数据库发送到一个模板:

Template.myTemplate.helpers({
  helper1: function() {
    var object1 = this;  // data context set in iron:router...path is context dependent
    // modify some values in object1
    return this;
  },
  helper2: function() {
    return Collection2.find({_id: this.object2_id});
  }
});

这个模板也有一个事件处理程序来修改上面的两个对象。我试图从上面访问 helper1 和 helper2,但是如果我调用模板的数据上下文,我只能访问 object1 的未修改版本。如何访问上面定义的帮助程序?

Template.myTemplate.events({
  'submit form': function(event) {
    event.preventDefault();
    // Access helper2 object and attributes here instead of calling Collection2.find() again
  }
});

【问题讨论】:

  • 无法使用当前的公共 API 调用助手。
  • 佩佩,你可能知道这一点,但我刚刚发现有一个用于访问助手的内部 api - Template.myTemplate.__helpers.get('helper');
  • 鉴于这是内部的,我假设 api 将来可能会改变,因此在您的代码中经常使用它可能不是最好的主意。
  • 请记住,您不能依赖在您以这种方式调用的助手中使用this,我猜Template.instance() 也不会起作用,除非您执行更多公共API 违规行为。
  • @bgmaster, Template.myTemplate.__helpers.get('helper'); 太老套了,将来随时可能过时。 Blaze 不是为这种方式设计的...在下面查看我的答案

标签: javascript meteor meteor-blaze


【解决方案1】:

如果你可以从事件中修改助手,那么,Meteor 应用程序的任何部分都可以,这违背了 Blaze 的设计理念!

Blaze 被设计为单向数据绑定的诱人系统。您所要求的可以使用 Angular 来实现(单独使用,或与 Blaze 一起使用,请查看 THIS),它本质上是一个 2 路数据绑定的诱人系统。

您可能还想检查 React,它也是一种 2 路数据绑定

【讨论】:

    【解决方案2】:

    Helper 只是函数,因此可以随意传递并分配给其他变量,因此您可以定义一个函数,然后为其分配模板助手的 helper2 键,并通过事件处理程序的原始引用调用它。

    var helperFunction = function() {
        return Collection2.find({_id: this.object2_id});
    };
    
    Template.myTemplate.helpers({
        helper1: function() {
            var object1 = this;  // data context set in iron:router...path is context dependent
            // modify some values in object1
            return this;
        },
        helper2: helperFunction
    });
    
    Template.myTemplate.events({
        'submit form': function(event) {
            event.preventDefault();
            var cursor = helperFunction();
        }
    });
    

    【讨论】:

    • 谢谢。这种模式有助于避免重复代码,这是我的目标。我唯一要注意的是函数中的 this 可以更改。当您在事件处理程序中调用该函数时,这将成为 Window 对象而不是数据上下文。考虑到事件处理程序中的这仍然是数据上下文,我觉得这很奇怪。如果您可以更新您的答案以反映这一点,我会将其标记为正确。
    • 正如@bgmaster 所指出的,您需要调用the call method 并提供thisArg 而不是简单地调用该函数。但是,在这种情况下,您不知道thisArg 应该是什么(并且使用{{helper2}} 的时间可能不同,因此这通常不起作用)。
    猜你喜欢
    • 2015-05-24
    • 2016-10-16
    • 2016-01-03
    • 2015-04-16
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多