我正在尝试设置MDC对话框警告。我没有将对话框复制粘贴到需要它的每个视图中,而是将对话框包装在其自己的模板中。该模板似乎正常工作,对话框打开并正常运行,但是,我无法为其设置一个辅助功能。我尝试使用父模板的helper函数,甚至使用自己的js文件创建新模板。这些解决方案都不能正确地获取数据。
<template name="transactionAlert">
...
<div class="mdc-dialog__content" ><p>Are you sure you wish to continue with this transaction? It could cost up to: <b class="warning-value">${{maxCost}} USD</b></p>
...
</template>
<template name="transactionCreate">
...
{{>transactionAlert}}
</template>
Template.transactionAlert.onCreated(function transactionAlertOnCreated() {
console.log('test')
})
Template.transactionAlert.helpers({
maxCost(){
console.log('test 2')
const instance = Template.instance()
return instance.maxTxCost.get().toString().slice(0,5);
}
})
答案 0 :(得分:0)
我尝试使用父模板的助手功能
这类问题通常是由设计问题引起的,而不是缺少或错误的实现。如果我们认为您的transactionAlert
是无状态的(它不包含任何相关的视图逻辑或内部状态管理),那么它也不应访问超出其范围的属性或帮助程序。
否则,您将创建紧密的耦合,从而在两年左右的时间里(当重构会话正在调用时)会再次出现在您的脸上。
相反,父模板的职责是
transactionAlert
应该出现还是消失transactionAlert
模板因此,您可以将交易警报设计为参数化模板:
<template name="transactionAlert">
...
<div class="mdc-dialog__content" ><p>Are you sure you wish to continue with this transaction? It could cost up to: <b class="warning-value">${{maxCost}} USD</b></p>
...
</template>
如您所见,它看起来完全一样。区别在于,您删除了Template.transactionAlert.helpers
并导致模板寻找maxCost
传递给模板。
现在,在适用预警条件的情况下,您现在可以在父模板中将数据传递到transactionalert
:
<template name="transactionCreate">
{{#if showAlert}}
{{>transactionAlert maxCost=getMaxCost}}
{{/if}}
</template>
助手现在所在的位置:
Template.transactionCreate.helpers({
showAlert () {
return Template.instance().showAlert.get()
},
getMaxCost(){
const instance = Template.instance()
return instance.maxTxCost.get().toString().slice(0,5);
}
})
由于您需要反应来显示/隐藏警报,因此您将使用模板的内部跟踪器:
Template.transactionCreate.onCreated(function () {
const instance = this
instance.showAlert = new ReactiveVar(false)
instance.autorun(() => {
const maxCost = instance.maxTxCost.get()
if (/* max cost exceeds limit */) {
instance.showAlert.set(true)
} else {
instance.showAlert.set(false)
}
})
})
编辑:有关反应性的其他信息
反应性是Meteor客户生态系统的主要概念。它基于Tracker程序包,该程序包链接到任何Template
实例。反应性数据存储指南进一步解释了该概念:https://guide.meteor.com/data-loading.html#stores