Template.instance()和上下文与Blaze块助手混淆

时间:2015-01-25 05:26:50

标签: meteor meteor-blaze

我使用一个简单的模板块助手来显示加载动画,隐藏其中的任何内容。这对于提交表单和防止按钮按两次非常有用。

<template name="waiting">
  {{#if isLoading}}
      {{> loader}}
  {{else}}
    {{> UI.contentBlock}}
  {{/if}}
</template>

我决定把它放在一个帮助器中,因为我之前从未尝试过,我想保持我的代码DRY - 我在几个地方使用这种模式。

我遇到了使用此块帮助程序来访问块助手的Template.instance()而非其所在模板的问题。我也遇到了模板上下文的问题。以下是我的问题的详细信息:

我设置了一个确认删除按钮,如下所示:

  {{#waiting isLoading=loadingDelete}}
    {{#if confirmDelete}}
      <button class="confirm">Are you sure?</button>
    {{else}}
      <button class="delete">Delete</button>
    {{/if}}
  {{/waiting}}

我还将loadingDeleteconfirmDelete个反应变量放在模板实例中,这样我就不会污染Session

Template.editRecord.created = ->
  @loadingDelete = new ReactiveVar(false)
  @confirmDelete = new ReactiveVar(false)

Template.editRecord.helpers
  loadingDelete: () -> Template.instance().loadingDelete.get()
  confirmDelete: () -> Template.instance().confirmDelete.get()

然后我创建了一些像这样的事件:

&#39;点击.delete&#39;:(e,t) - &gt;     t.confirm.set(真)

&#39;点击。确认&#39;:(e,t) - &gt;     t.loadingDelete.set(真)     _id = @_id     Meteor.call&#39; deleteRecord&#39;,_id,(err) - &gt;       t.loadingDelete.set(假)       如果错了         console.log错误       其他         Router.go&#34; home&#34;

此实现的问题是Template.instance()引用confirmDelete帮助程序中的等待模板:

confirmDelete: () -> Template.instance().confirmDelete.get()

第二个问题是事件中的数据上下文引用了等待模板的上下文,因此我需要使用_id = Template.parentData()_id而不是_id = @_id。但我无法从这里访问editRecord模板实例或其任何变量,这令人沮丧。

我将模板更改为修复第一个问题的模板。

  {{#if confirmDelete}}
    <button class="confirm">Are you sure?</button>
  {{else}}
    {{#waiting isLoading=loadingDelete}}
      <button class="delete">Delete</button>
    {{/waiting}}
  {{/if}}

但这很难看,而不是我想要的。我希望只是用这个块帮助器替换我的#if块,但是在尝试使用我的模板干掉时,我最终编写了更多的代码。这似乎并不合适。

我注意到#if阻止了这些上下文和模板实例问题。有什么我想念的吗?

1 个答案:

答案 0 :(得分:0)

事实证明,Meteor团队已经识别出这个错误,正在努力解决它。请参阅此PR