【发布时间】:2015-03-23 21:17:21
【问题描述】:
我正在使用一个简单的模板块助手来显示加载动画,隐藏其中的任何内容。这对于提交表单和防止按钮被按下两次非常有帮助。
<template name="waiting">
{{#if isLoading}}
{{> loader}}
{{else}}
{{> UI.contentBlock}}
{{/if}}
</template>
我决定把它放在一个块助手中,因为我以前从未尝试过它,而且我想让我的代码保持干燥——我在几个地方使用了这种模式。
我在使用此块助手访问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()
然后我创建一些这样的事件:
'点击 .delete': (e,t) -> t.confirm.set(true)
'点击 .confirm': (e,t) -> t.loadingDelete.set(true) _id = @_id Meteor.call 'deleteRecord', _id, (err) -> t.loadingDelete.set(false) 如果出错 控制台日志错误 别的 Router.go“回家”
这个实现的问题是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 块不会导致这些上下文和模板实例问题。有什么我遗漏的吗?
【问题讨论】:
标签: meteor meteor-blaze