具有自动发布功能的流星铁路由器未以更新形式获取预填充字段

meteor iron-router with autopublish not getting prefilled fields in update form

可能与 autoform 无关,但由于我不完全确定,所以我想我也应该将此信息放在这里。在我的表单中,我没有得到任何我期望更新表单的预填字段,而且我的控制台中有一些我不理解的奇怪输出。

对应的路由部分为:

// app/lib/routes.js
Router.route('/assignment/:_id', function(){
    var assignment = Assignments.findOne({_id: this.params._id});
    console.log('ass w/' + this.params._id);
    console.log(assignment);
    this.render('Assignment', {data: assignment});  
}, {name: 'assignment.show',
    waitOn: function(){
        console.log('do the wait');
        Meteor.subscribe('assignments');
    }
  }
);

如您所见,那里已经有很多调试输出。路由貌似调用正确,点击后显示模板

发布在这里:

// app/server/publish.js
Meteor.publish('assignments', function() {return Assignments.find();})

现在,这段代码似乎被调用了多次。进入这条路线后的整体输出为:

do the wait
routes.js:22 ass w/M2gtLf9vbbWCTgxze
routes.js:23 undefined
debug.js:41 insert failed: Access denied. No allow validators set on restricted collection for method 'insert'.
routes.js:27 do the wait
routes.js:22 ass w/M2gtLf9vbbWCTgxze
routes.js:23 Object {_id: "M2gtLf9vbbWCTgxze", title: "Neuer Titel", priority: "high", description: "just do it"}

(插入错误可能来自其他地方)那里可能还有其他一些错误,但我希望输出显示问题。我没有得到的是,一开始我似乎没有得到分配,但在第二次调用时收到了,这对我来说很奇怪(为什么会这样?)。我不太确定文件夹结构,但 publish.js 不是在 route.js 之后调用的,所以可能有未发布的内容?如果是,那么我的文件放在哪里?

可能不重要,但这是我的 assignment.html

<template name="Assignment">
    <div class="panel panel-default" id="main">
        <div class="panel-heading">Change Assignment</div>
        <div class="panel-body">
            {{>quickForm collection="Assignments" id="updateAssignmentForm" type="method" meteormethod="updateAssignment"}}
        </div>
    </div>
</template>

那么,为什么路由器被调用了两次,为什么一开始没有输出,为什么我在这里没有得到任何预填充的字段? (我的表格中所有字段都是空的)

您的路由函数在订阅返回数据之前 运行。您可以简单地将它放在 data 函数中,它会等待:

Router.route('/assignment/:_id',{
  data: function(){
    return Assignments.findOne({_id: this.params._id});  
  },
  name: 'Assignment',
  waitOn: function(){
    return Meteor.subscribe('assignments');
  }
});