如何从autoform钩子访问模板实例数据

How to access template instance data from autoform hook

本文关键字:实例 数据 访问 autoform      更新时间:2023-09-26

声明一个实例相关的字典

Template.newMessage.onCreated(function () {
    var self = this;
    self.dict = new ReactiveDict('namedDic');
});

并在helper和events中通过Template.instance().dict.get()访问它。

然而,autoform在某处嵌套了另一个模板,所以我访问这个字典的代码不再工作:

AutoForm.hooks({
    serverCall: {
        before: {
            method: function (insert, update, current) {
                insert.foo = Template.instance().dict.get('foo'); <-- fails
                Meteor.call('serverCall', insert);
                return true;
            }
        }
    }
});

文档似乎没有提到任何访问父模板的方法,我不想开始猜测它有多少层父模板。

如果有区别的话,我的标记是这样的: +quickForm id='newMessage' schema='Schema.CustomMessage' type='method' meteormethod='serverCall'

这是一个有点a ->B的问题,我想做的只是有自动生成和验证几个字段,然后我可以插入一些隐藏的值作为helper/event/hook的一部分,然后将其发送到服务器。

我确信这不是最好的方法,但我通过在同一文件范围内设置外部变量得到了它的工作原理。例子:

var myNewMessageTemplate = null;
Template.newMessage.onCreated(function () {
    var self = this;
    self.dict = new ReactiveDict('namedDic');
    myNewMessageTemplate = self;
});
AutoForm.hooks({
    serverCall: {
        before: {
            method: function (insert, update, current) {
                insert.foo = myNewMessageTemplate.dict.get('foo'); <-- fails
                Meteor.call('serverCall', insert);
                return true;
            }
        }
    }
});

你需要确保的是,hooks和onCreate在同一个文件中,在同一个作用域中

我以前这样做过:

定义一个帮助器来检索ReactiveDict

Template.newMessage.helpers({
   foo : function () {
       return Template.instance().dict.get('foo');
   }
});

然后,在模板的某个地方包含该帮助器。使用class="hidden"如果你不想让用户看到它。

<input type="text" class="hidden" value="{{foo}}" data-schema-key="foo" name="foo">

当quickForm提交时,我相信它会查找定义了data-schema-key属性的所有输入(或者可能会查看名称,您可以同时定义这两个属性以确保正确)。

使用这个方法,你不需要定义任何钩子。