通过autoform hooks插入新的doc调用meteor方法

时间:2016-01-13 01:57:06

标签: meteor meteor-autoform

我想使用autoform将新文档插入db。 Autoform hook在服务器上调用meteor方法来插入文档。

我在模板中有这个...

{{#autoForm collection="Reports" id="addReport" type="insert"}}
    <div class="row">
        <div class="col s6">
            {{> afQuickField name='hours'}}
        </div>
    </div>
    <button class="btn waves-effect waves-light modal-action modal-close"><i class="material-icons">save</i></button>
{{/autoForm}}

则...

AutoForm.hooks({
    addReport: {
        onSubmit: function(insertDoc) {
            Meteor.call('addReport', insertDoc, function(error, result) {
                if (error) alert(error.reason);
            });
            return false;
        }
    }
});

然后是服务器上的方法......

Meteor.methods({
    addReport: function(insertDoc) {   
        var report = _.extend(insertDoc, {
            userId: Meteor.userId(),
        });
        return Reports.insert(report);
    }
});

我在集合中有createdAtupdatedAt个字段,但它们都有autoValue因此,我认为不需要从客户端或流星方法中插入。

因此,使用模式的集合如下所示:

Reports = new Meteor.Collection('reports');

Reports.attachSchema(new SimpleSchema({
    hours: {
        type: Number,
        label: "Number of hours",
        decimal: true
    },
    createdAt: {
        type: Date,
        label: "Created Date",
        autoValue: function() {
            if (this.isInsert) {
                return new Date;
            } else {
                this.unset();
            }
        },
        denyUpdate: true
    },
    updatedAt: {
        type: Date,
        autoValue: function() {
            if (this.isUpdate) {
                return new Date()
            }
        },
        denyInsert: true,
        optional: true
    },
    "userId": {
        type: String,
        autoform: {
            type: "hidden",
        }
    },
}));

当我运行meteor时,表单显示,但提交什么都不做。没有视觉提示是否有任何错误。客户端和服务器控制台中都没有错误消息。

我做错了什么或错过了什么?

2 个答案:

答案 0 :(得分:2)

aldeed / meteor-autoform文档:

  // Called when form does not have a `type` attribute
  onSubmit: function(insertDoc, updateDoc, currentDoc) {
     Meteor.call()...
  }

我正在关注discovermeteor书,我正在尝试使用本书的一些方法,但使用meteor-autoform包。

post_submit.html

<template name="postSubmit">

    {{#autoForm collection="Posts" id="insertPost"}} <-- no type

            <div class="form-group">
                <div class="controls">
                    {{> afQuickField name='title' class='title form-control'}}
                </div>
            </div>
            <div class="form-group">
                <div class="controls">
                    {{> afQuickField name='description' class='description form-control'}}
                </div>
            </div>

            <input id="send" type="submit" value="Send" class="btn btn-primary"/>

    {{/autoForm}}

</template>

post_submit.js

var postSubmitHook = {

    onSubmit: function(insertDoc){
        Meteor.call('postInsert', insertDoc, function(error, result) {

            if (error){
                Bert.alert(error.reason, 'danger', 'growl-top-right');
                $('#send').removeAttr('disabled');
                return;
            }

            Router.go('postPage', {_id: result._id});
        });
        return false;
    }
};

AutoForm.addHooks('insertPost', postSubmitHook);

答案 1 :(得分:2)

由于@Cristo GQ说得对,我只是想确保答案对于此线程的未来访问者来说足够清楚

onSubmit 挂钩将仅用于 用于 type='normal'而不包含任何< / strong> type=

另一方面,before.insert 挂钩仅适用于type='insert'并且没有before.normal 挂钩
这意味着当使用onSubmit hook 时,我们必须在工作之前做任何事情&#34;&#34; (比如在onSubmit本身内添加 currentUser )。