Meteor Flow Router问题与更新

时间:2015-10-01 19:23:52

标签: meteor

我有一个Meteor应用程序,我正在从IronRouter转换到FlowRouter。到目前为止一直很好,但有些方面我还不了解。

我的路线如下:

FlowRouter.route('/documents/:docId/edit', {
  name: 'documentEdit',
  subscriptions: function (params, queryParams) {
    this.register('documentEdit', Meteor.subscribe('documentSingle', params.docId));
  },
  action: function (params, queryParams) {
    BlazeLayout.render('layout', { top: 'header', main: 'documentEdit' });
  },    
});

第一个选项:

然后我还有一个模板:

<template name="documentEdit">
  <div class="container">
    <h1>Edit document</h1>
    {{#if isReady 'documentEdit'}}
      {{#autoForm collection="Documents" doc=this id="documentForm" type="update" meteormethod="documentUpdateMethod"}}
        <fieldset>
          {{> afQuickField name='title'}}
          {{> afQuickField name='content' rows=6}}
        </fieldset>
        <button type="submit" class="btn btn-primary">Update</button>
        <a class="btn btn-link" role="button" href="{{pathFor 'documentsList'}}">Back</a>
      {{/autoForm}}
      {{/if}}
   </div>
</template>

使用模板助手,如下所示:

Template.documentEdit.helpers({
 isReady: function(sub) {
    if(sub) {
      return FlowRouter.subsReady(sub);
    } else {
      return FlowRouter.subsReady();
    }
  }
});

这是提到的here,但是我没有在UI上的文本框中预先填充这些值(编辑字段时这是正常的)。

第二个选项:

当我执行以下操作时,它可以工作,我不明白为什么它有效(发现它在不同的论坛中浏览并尝试过):

<template name="documentEdit">
  <div class="container">
    <h1>Edit document</h1>
    {{#with getDocument }}
      {{#autoForm collection="Documents" doc=this id="documentForm" type="update" meteormethod="documentUpdateMethod"}}
        <fieldset>
          {{> afQuickField name='title'}}
          {{> afQuickField name='content' rows=6}}
        </fieldset>
        <button type="submit" class="btn btn-primary">Update</button>
        <a class="btn btn-link" role="button" href="{{pathFor 'documentsList'}}">Back</a>
      {{/autoForm}}
    {{/with}}
   </div>
</template>

和帮手:

Template.documentEdit.helpers({
 getDocument: function () {
    return Documents.findOne();
 }
});

所以问题是:

  • 第一个选项:任何想法为什么它不起作用。我更喜欢那个,因为它是记录的做事方式
  • 第二个选项:不知道为什么我需要(在模板助手中)做Document.findOne()而不必传递我想要编辑的文档的ID:

2 个答案:

答案 0 :(得分:5)

您希望使用Flow Router进行模板级订阅,这是主要模式更改之一。

所以你要这样做:

在模板级别设置订阅。自动运行以便重新订阅路线更改。

objdump

设置模板帮助程序以从路径中获取,并获取id并填充帮助程序/文档。

<html>
<head>
<style>
div#title {
  background-image: url("banner.png");
  color:yellow;
  height:120px;
  width:100%;
}
</style>
</head>
<body>
<div id=title>

</div>

进行模板级加载检查,如果有渲染,否则显示加载...

Template.documentEdit.onCreated(function() {
  var self = this;
  this.autorun(function() {
    var docId = FlowRouter.getParam('docId');
    self.subscribe('documentSingle', docId));
  };
};

答案 1 :(得分:0)

不知道这是如何工作的,看到我读过的所有教程都涉及更新使用的Iron路由器,我花了7天时间尝试重试,查看其他代码,阅读教程。快乐它现在有效。