Ошибка маршрутизатора Meteor Flow с обновлением

63
4

У меня есть приложение 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();
}
}
});

Это как указано здесь, но я не получаю значения, предварительно заполненные в текстовых окнах интерфейса (что нормально при редактировании полей).

Второй вариант:

Когда я делаю следующее, он работает, и я действительно не понимаю, почему он работает (нашел, что он просматривает на разных форумах и проверял его):

<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() даже не передавая идентификатор документа, который я хочу изменить:

спросил(а) 2021-01-25T18:36:01+03:00 4 месяца, 4 недели назад
1
Решение
109

Вы хотите выполнить подписку на уровне шаблона с помощью Flow Router, что один из основных изменений шаблона.

Так вы бы сделали:

Установите подписку на уровне шаблона. Autorun, чтобы он переписывал изменения маршрута.

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

Настройте помощник шаблона, чтобы выбрать маршрут, и возьмите идентификатор и заполните помощник/документ.

Template.documentEdit.helpers({
getDocument: function () {
var docId = FlowRouter.getParam('docId');
var doc = Documents.findOne(docId) || {};
return doc;
}
});

Сделайте проверку нагрузки на уровне шаблона, и если она там отобразится, в противном случае показать загрузку...

<template name="documentEdit">
<div class="container">
<h1>Edit document</h1>
{{#if Template.subscriptionReady}}
{{#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}}
{{else}}
Loading...
{{/if}}
</div>
</template>

ответил(а) 2021-01-25T18:36:01+03:00 4 месяца, 4 недели назад
45

Не зная, как это сработало, увидев, что все обучающие материалы, которые я прочитал, которые касаются обновления, используемого Iron router, я потратил 7 дней на попытку повторной попытки, просматривая другие коды, читая учебные пособия. Счастлив, теперь он работает.

ответил(а) 2021-01-25T18:36:01+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема