Почему все помощники шаблонов Meteor внутри / с каждого блока вызываются при изменении несвязанного поля в родительском?
При использовании блока #with в шаблонах Meteor, если я редактирую отдельное поле в крайнем логическом разделе блока, это все равно вызывает повторный вызов всех помощников шаблонов в блоке #with. Это относится и к каждому. Чтобы продемонстрировать это, я загрузил проект на github. Его можно найти по адресу:
https://github.com/adnancin/meteor-test-template-render
Если вы загрузите и запустите этот проект, вы увидите страницу, которая отображает следующее:
- Владелец проекта (поля firstName и lastName).
- Проекты (поля имя и тип).
- Задачи для каждого проекта (поля: идентификатор проекта, имя и оценка)
В наборе данных по умолчанию есть один владелец проекта, два проекта и две задачи, где две задачи принадлежат первому проекту.
Проекты находятся под привязкой #with OwnerProject.
Проекты перечислены с использованием привязки #each.
Задачи в проектах также перечислены с использованием привязки #each.
Я дал две кнопки для изменения данных. Один меняет данные первого проекта. Другой меняет имя владельца проекта. У помощников шаблона есть консольные журналы, чтобы показать, какой из них запущен.
Когда данные проекта изменяются, запускаются помощники шаблонов для задач в этом проекте. Когда имя владельца меняется, запускается каждый помощник. Ни один из этих случаев не должен происходить в соответствии с документированными документами. Он должен быть только помощником для поля, которое изменилось.
Это ошибка? Или это особенность, для которой есть очевидный / неочевидный обходной путь?
1 ответ
Ну, я решил проблему. Прежде чем углубляться в детали, следует сказать, что Meteor решил внедрить помощники шаблонов данных для повторного запуска при любых изменениях в родительском контексте данных. Зачем? Я все еще не уверен. (Жду ответа) В то же время я понял, что если изменение документа контекста данных может вызвать полный набор повторов, то лучше всего удалить из изменяемой информации контекст контекста данных. Я обновил свой проект на github (ссылка в вопросе), чтобы отразить это.
Шаблон ранее выглядел как
projecttemplate.html
<template name="projectTemplate">
{{#with superTemplate}}
{{fullName}}
{{#each multiProject}}
<h3>Here is the {{this.name}}</h3>
<p>And this is the {{type}}</p>
<p>And here they are combined: {{nameType}}</p>
<p>And these are the tasks associated with it </p>
{{> tasksTemplate}}
{{/each}}
{{/with}}
</template>
В этом супер шаблон устанавливает контекст для всего остального. Владелец проекта ссылался на принадлежащие ей проекты, которые использовались для нескольких проектов. В цикле с несколькими проектами контекст данных для каждой задачи в этом проекте был законченным объектом проекта.
Текущий шаблон
projecttemplate.html
<template name="projectTemplate">
{{#with ownerProjectId}}
{{#with ownerProjectData}}
{{fullName}}
{{/with}}
{{#each multiProject}}
{{#with singleProjectData}}
<h3>Here is the {{this.name}}</h3>
<p>And this is the {{type}}</p>
<p>And here they are combined: {{nameType}}</p>
<p>And these are the tasks associated with it </p>
{{/with}}
{{> tasksTemplate}}
{{/each}}
{{/with}}
</template>
Этот шаблон изменил контекст данных. Вместо использования полного объекта-владельца проекта он использовал только идентификатор этого владельца. Чтобы отобразить свойства владельца, был использован объект с привязкой к помощнику шаблона с именем ownerProjectData. Помощник ownerProjectData извлекает объект OwnerProject на основе идентификатора и возвращает его. Это помогает отделить данные, которые необходимы для проектов, от данных, которые не нужны.
Этот шаблон снова применяется к каждой привязке в проектах. Вместо использования полной модели проекта, я использую только поле идентификатора проекта, которое является всем, что действительно необходимо для задач. Для области, в которой мне нужно отобразить информацию о проекте, я снова использую помощника, который получает полную модель проекта на основе идентификатора, переданного в каждой итерации цикла.
Особенность, с которой я столкнулся , это действительно важно, это то, как изменилось моделирование моих данных, будет ли вызван полный повтор помощников, когда я добавлю проект. В тот момент, когда вставка нового проекта приведет к полному повторному запуску, документ данных OwnerProject выглядел следующим образом:
{
OwnerProject:
_id: "ownersautoassignedid"
firstName: "some",
lastName: "example",
projects:[
"idofproject1","idofproject2"
]
}
В этом случае OwnerProject хранит ссылку на все принадлежащие ей проекты. Если я добавлю новый проект под ней, я вставлю проект, получу его идентификатор, а затем обновлю владельца. Это, однако, приведет к полному повторному запуску всех помощников. Вместо этого я удалил свойство projects из владельца и изменил структуру проекта, чтобы иметь ссылку на идентификатор владельца. На стороне шаблона я получил идентификаторы проекта, выполнив выбор, где идентификатор владельца был равен идентификатору контекста superTemplate. На этот раз при вставке нового проекта вызывались только помощники шаблона для нового проекта, а остальные элементы не затрагивались.
Там у вас есть это. Длинный ответ, описывающий довольно простое решение проблемы, с которой вы обязательно столкнетесь, если будете следовать стандартной документации для метеора. Надеюсь, это поможет в будущем.
Не забудьте взглянуть на источник в проекте github и проверить историю коммитов и проблемы с github. Он опишет, как я сюда попал.