【问题标题】:Accessing other templates' instances访问其他模板的实例
【发布时间】:2015-10-06 12:36:09
【问题描述】:

您可以通过Template.instance() 访问当前模板的实例。但是您经常会遇到必须访问其他模板的实例的情况。例如,如果您使用ReactiveVar,那么您可能想要获取或设置附加到其他模板实例的变量。

我遇到了How to get the parent template instance (of the current template),但这并不完整。

第一季度。我们如何访问任何模板的实例,而不仅仅是当前模板的

第二季度。如果我需要访问其他模板的实例,是否违反 Meteor 方式?

【问题讨论】:

  • 在撰写本文时,blaze 没有内置组件库,因此您只能做Blaze.getData 之类的事情。如果你有一个具体的例子,我可以用代码给出一个更具体的例子。

标签: meteor


【解决方案1】:

您可以尝试直接在模板级别而不是在实例内部设置模板变量。

Template.example.myVariable = new ReactiveVar();

而不是

Template.example.onCreated(function (){
  this.myVariable = new ReactiveVar();
});

【讨论】:

    【解决方案2】:

    如果您的目标模板在同一个文件中,您可以在文件开头定义模板函数之外的反应变量。文件中的所有模板都可以访问它。

    如果您的目标模板是父模板(或任何其他父模板),您可以使用Template.parentData() 访问其数据上下文,参数是父模板的等级(默认为1)。看来你已经知道了。

    如果您需要访问同一页面中不同模板中的 DOM 元素,可以使用 jQuery 选择器。

    我不知道有什么其他方法可以到达另一个模板实例(afaik,没有Blaze.getTemplate(name) 函数。)你所指的答案似乎是你能得到的更好。

    【讨论】:

      【解决方案3】:

      我认为这纯粹是主观的,因为在 Meteor 中有很多不同的做事方式,但我实际上认为 Session 非常适合在多个模板之间共享变量。人们认为Session 很糟糕,因为它是全局的并且会污染命名空间。我认为开发人员应以任何适合他们的方式保持环境清洁。例如,这很糟糕:

      Session.set('count', 23);
      Session.set('last', new Date());
      

      但这样更好:

      Session.set('notifications/count', 23);
      Session.set('notificatinos/last', new Date());
      

      【讨论】:

        【解决方案4】:

        我得到的最接近的方法是通过其中一个元素来定位模板(假设模板包含一个表单)

        Blaze.getView($('form')[0]).templateInstance().someReactiveVar.set('changed')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-12
          • 1970-01-01
          • 1970-01-01
          • 2010-12-29
          相关资源
          最近更新 更多