Meteor autoform,钩前异步回调

时间:2015-01-28 09:32:21

标签: meteor meteor-slingshot

我正在使用Autoform和Slingshot进行S3交互。当用户提交表单时,我想拦截进程,通过Slingshot将文件上传到S3,使用返回的doc扩展downloadUrl对象,然后返回新的更新文档,并继续自动化过程

我有以下代码:

{{#autoForm collection="Tabs" id="newTabForm" type="method" meteormethod="createTab"}}

   ...
    <div class="modal-body">
      <fieldset>
         {{> afFormGroup name='downloadUrl' type='file' class='file-bag'}}
    ...

AutoForm.hooks({
  newTabForm: {
    before: {
      insert: function(doc, template) {
        console.log(doc);
        var file     = $('.file-bag')[0].files[0];

        var self = this;
        uploader.send(file, function(error, downloadUrl) {
          if (error) { throw new Meteor.Error(error); }

          doc = _.extend(doc, { downloadUrl: downloadUrl });
          self.result(doc);
        });
      }
    },
 ....

Meteor.methods({
createTab: function(doc) {
  check(doc, TabSchema);

  var priceInCents = doc.price * 100;
  var extraTabAttributes = {
    userId: Meteor.userId(),
    price: priceInCents
  };

  _.extend(doc, extraTabAttributes);
  Tabs.insert(doc, function(error, result) {
    if (error) { return error; }
  });
}

在文档上正确存储url(但看起来很奇怪,C:// fakepath / filename ..),但无法将其上传到S3服务器

另外的问题是,为什么前钩子中的console.log(doc);不会将任何内容记录到客户端/服务器上?

1 个答案:

答案 0 :(得分:3)

我不熟悉自动表单,但我认为你的挂钩不正确。

来自https://github.com/aldeed/meteor-autoform#callbackshooks,它说

before: {

  // Replace `formType` with the form `type` attribute to which this hook applies
  formType: function(doc) {}

}

所以在你的情况下,

insert: function(doc, template)

应替换为

method: function(doc, template)