Почему все помощники шаблонов 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. Он опишет, как я сюда попал.

Другие вопросы по тегам