3

我正在使用具有一级嵌套模式的 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;
  }
});

它不调用服务器方法。我尝试了 autoform onSubmit 钩子以及 Meteors 内置模板“提交”事件处理程序。如果我使用 jQuery onsubmit 事件处理程序,它会注册该事件。我不能为此目的使用 jQuery,因为 autoform 必须验证输入。

4

2 回答 2

3

由于createdmodified是必填字段,因此很可能没有提交,因为表单中缺少这些字段,这意味着表单无效。实际上有几种不同的方法可以解决这个问题:

  1. 使它们可选(可能不是您想要的)
  2. 对自动表单的属性使用不同的模式,一个没有这两个字段的模式schema
  3. 添加一个“before method”钩子,在提交的文档中设置这两个字段。
  4. 用于autoValue生成这两个字段的值。

由于使用autoValue很容易创建和修改日期,所以我会这样做。像这样的东西:

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;
        }
    }
}

此外,为了帮助在开发过程中更轻松地解决此类问题,我建议启用调试模式

于 2014-04-18T17:31:13.773 回答
2

Have you allowed inserts/updates on your collection? See 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, e.g.

Node.allow({
  insert: function (userId, nodeDoc) {
    // write some logic to allow the insert 
    return true;
  }
});
于 2014-04-19T01:00:39.467 回答