【问题标题】:How to access template instance data from autoform hook如何从 autoform 挂钩访问模板实例数据
【发布时间】:2015-10-18 15:34:59
【问题描述】:

我声明了一个实例相关的字典。

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

并在帮助程序和事件中通过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 问题,我想做的只是让 autoform 生成并验证几个字段,然后我可以在发送之前插入一些隐藏值作为帮助程序/事件/挂钩的一部分转到服务器。

【问题讨论】:

  • 是的,以这种格式阅读它也让我很痛苦,但我根本无法接受格式化代码的最佳方法是将其复制到一个新文件中,删除我所有级别的嵌套栏1,然后将其复制回编辑器,否则我必须整天站在这里发送空格键...
  • 这就像 15 秒的工作......对于带有颜色标记的格式正确的代码。
  • 同意。不过,我更喜欢 ``` 多行代码块语法,不需要额外的格式。无论如何,我认为我在这些 cmets 上花费了大约 6 种格式。感谢 Matthias 以身作则。

标签: javascript meteor meteor-autoform


【解决方案1】:

我过去曾这样做过:

定义一个帮助器来检索 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 属性的输入(或者它可能会查看名称,您可以同时定义两者来确定。

使用此方法,您应该不需要定义任何钩子。

【讨论】:

  • 我正在使用挂钩将所有隐藏字段逻辑保存在一个位置。这听起来像我必须为多个字段声明多个助手和隐藏输入。我目前正在将我的 reactiveDict 文件设置为范围,以便钩子可以引用它。
  • 明白了...如果可行,那么确定为什么不可行。我刚刚想到一件事:您可能可以将我的解决方案保留给一个返回整个字典的助手,以及一个遍历所有键并为每个键创建隐藏输入的模板。不过从未尝试过。
  • 另一个想法:将响应式字典作为表单属性传递,并通过钩子内的 this.formAttributes 访问。我倾向于避免依赖文件范围,因为我可能会进行一些重构和破坏。
  • 我做了更多阅读,并选择通过属性传递整个数据 obj。您实际上可以通过 this.template.parent().parent().parent.....dict.get('foo') 引用模板,但嵌套级别取决于 autoform。
【解决方案2】:

我确定这不是最好的方法,但我通过在同一文件范围内设置外部变量来实现它。 示例:

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 在同一个文件中,在同一个范围内。

【讨论】:

  • 这里要注意的非常重要的一点是same filesame scope
猜你喜欢
  • 2021-09-02
  • 2021-05-17
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多