简体   繁体   English

带有collection2的Meteor Autoform包不提交表单

[英]Meteor Autoform package with collection2 does not submit the form

I am using using collection2 and autoform with one level nested schemas 我正在使用collection2和autoform与一个级别的嵌套模式

Node = new Meteor.Collection('node',{
schema: new SimpleSchema({
       content: {
           type: String,
           label: "Content",
           max: 200
       }
       created: {
           type: Date,
           label: "Created Date"
       },
       modified: {
           type: Date,
           label: "Modified Date"
       }
   })
});

NodeMeta = new Meteor.Collection('Node_meta',{
schema: new SimpleSchema({
    desc:{
        type:String,
        max:200,
        label:"Description",
        optional:true
    }
})

});

Schema = {};

Schema.nodeWithMeta= new SimpleSchema({
  Node: {
     type: Node.simpleSchema()
  },
  Meta: {
     type: NodeMeta.simpleSchema()
  }
});


{{#autoForm schema=schema id="nodeForm" type="method" meteormethod="nodecreate"}}
  {{> afFieldInput name='Node.content' rows=8 }}
  {{> afFieldInput name='Meta.desc' rows=8}}    
  <button type="submit" class="btn btn-primary btn-submit">Create</button>
{{/autoForm}}

Template.nodeCreate.helpers({
  schema: function() {
    return Schema.nodeWithMeta;
  }
});

It does not call server method. 它不调用服务器方法。 I tried autoform onSubmit hook as well as Meteors inbuilt templates 'submit' event handler. 我尝试了autoform onSubmit钩子以及Meteors内置模板'submit'事件处理程序。 If I use jQuery onsubmit event handler, it registers the event. 如果我使用jQuery onsubmit事件处理程序,它会注册该事件。 I cannot use jQuery for this purpose since autoform has to validate the inputs. 我不能为此目的使用jQuery,因为autoform必须验证输入。

Since created and modified are required fields, it's most likely not submitting because those fields are missing from the form, which means the form is invalid. 由于createdmodified是必填字段,因此很可能无法提交,因为表单中缺少这些字段,这意味着表单无效。 There are actually a few different ways you can solve this: 实际上有几种不同的方法可以解决这个问题:

  1. Make them optional (probably not what you want) 让它们成为可选的(可能不是你想要的)
  2. Use a different schema, one without those two fields, for the schema attribute of the autoform. 使用不同的模式(没有这两个字段的schema )作为autoform的schema属性。
  3. Add a "before method" hook that sets those two fields in the submitted doc. 添加一个“before method”钩子,用于在提交的doc中设置这两个字段。
  4. Use autoValue to generate the values for those two fields. 使用autoValue为这两个字段生成值。

Since created and modified dates are fairly easy to do with autoValue , I would do it that way. 由于使用autoValue创建和修改日期相当容易,我会这样做。 Something like this: 像这样的东西:

created: {
    type: Date,
    label: "Created Date",
    autoValue: function () {
        if (this.isInsert) {
          return new Date;
        } else {
          this.unset();
        }
    }
},
modified: {
    type: Date,
    label: "Modified Date",
    autoValue: function () {
        if (this.isInsert) {
          this.unset();
        } else {
          return new Date;
        }
    }
}

Also, to help figure out issues like this more easily while developing, I recommend enabling debug mode . 另外,为了在开发过程中更容易找出这样的问题,我建议启用调试模式

Have you allowed inserts/updates on your collection? 您是否允许在您的收藏中插入/更新? See http://docs.meteor.com/#dataandsecurity . 请参见http://docs.meteor.com/#dataandsecurity

I bet if you run the two commands below, it'll work. 我打赌如果你运行下面的两个命令,它会工作。

meteor add insecure
meteor add autopublish 

Now try your submit. 现在尝试提交。

If it does work, turn autopublish and insecure back off 如果它确实有效,请关闭自动发布和不安全状态

meteor remove insecure
meteor remove autopublish

Then write your allow methods, eg 然后编写你的允许方法,例如

Node.allow({
  insert: function (userId, nodeDoc) {
    // write some logic to allow the insert 
    return true;
  }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM