Какая связь между представлением Blaze и шаблоном?

Я понимаю, что Blaze используется, чтобы сделать шаблон реактивным с помощью Tracker. Я знаю, что шаблон содержит множество объектов View, по одному для каждого элемента шаблона.

Представления являются «строительными блоками реактивных шаблонов» и «представляют собой реактивную область DOM». И (из документов) View может соответствовать «текущему помощнику шаблона, обработчику событий, обратному вызову или автозапуску».

Но я не понимаю, что такое объект View и как Blaze View относится к чему-то вроде Template.mytemplate.helpers() и Template.mytemplate.autorun(). Например, соответствует ли каждая вспомогательная функция одному объекту View? Или только когда функция включает реактивный источник данных? Метод autorun предназначен для всего шаблона, как представление может быть связано со всем шаблоном, который имеет несколько объектов представления?


person dayuloli    schedule 11.02.2015    source источник


Ответы (1)


Это немного сложно объяснить, потому что они немного изменили его с тех пор, как я понял его лучше.

Если у вас есть такой шаблон

<template name="mytemplate">
    <p>{{value1}}</p>
    <p>{{value2}}</p>
</template>

и такие помощники:

Template.mytemplate.helpers({
    value1: function() { return Session.get("vala"); },
    value2: function() { return Session.get("valb"); },
});

Это закончится примерно так:

Template["mytemplate"] = new Template("Template.mytemplate", (function() {
  var view = this;
   return [HTML.P(Blaze.View(function() {
       return Spacebars.mustache(view.lookup("value1"));
 })), "\n   ", HTML.P(Blaze.View(function() {
       return Spacebars.mustache(view.lookup("value2"));
   }))];
}));

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

Каждый помощник не обязательно будет соответствовать каждому представлению. Каждое представление представляет собой область, которая может быть изменена реактивным образом. Похоже, что это так, поскольку помощники могут изменять содержимое. У вас может быть один помощник и несколько представлений для него, а также вы можете иметь представления из других типов выражений руля, таких как {{#if}}.

Когда каждый раздел Blaze.View отображается на экране, каждый имеет instance. Это означает, что вы можете иметь точно такое же представление (возможно, определенное как переменную?), но два разных значения, отображаемых на экране. Каждый может иметь экземпляр. Каждый экземпляр имеет такие методы, как:

  • автозапуск. Позволяет добавить реактивный метод в файл Blaze.View. Это означает, что если вы можете добавить метод, содержащий Tracker вычислений, которые сообщают Blaze.View, когда перерисовывать - только представление содержимого в них.

  • firstNode и lastNode. Это дает первый элемент DOM и последний элемент DOM файла Blaze.View. Это позволяет движку рендеринга Blaze «знать», где изменить любой HTML/DOM, если есть изменение от запуска autorun

  • onXXX Это события, когда представление создается или уничтожается. В конечном итоге они переходят к шаблону, содержащему представления.

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

Когда вы запускаете autorun для всего шаблона, это совершенно отдельное вычисление, поэтому вы не можете напрямую изменить DOM из this.autorun в шаблоне. Вы должны использовать реактивную переменную, такую ​​как установка Session.set("vala", "new value").

Когда вы измените Session.set("vala", "new value"), первые Blaze.View будут перерисованы. Это связано с тем, что у него есть .autorun (специальный внутренний), который сообщит виду о перерисовке, не касаясь другого вида.

Надеюсь, я ответил на ваши вопросы. Если у вас есть что-то более конкретное, пожалуйста, дайте мне знать, и я отредактирую ответ с этой информацией, если смогу.

person Tarang    schedule 11.02.2015