我使用一个简单的模板块助手来显示加载动画,隐藏其中的任何内容。这对于提交表单和防止按钮按两次非常有用。
<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}}
我还将loadingDelete
和confirmDelete
个反应变量放在模板实例中,这样我就不会污染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
阻止了这些上下文和模板实例问题。有什么我想念的吗?