2014-07-17 3 views
2

Я хочу дать своим пользователям возможность создавать шаблоны документов (контракты, письма и т.д.)Метеор, как сохранить шаблоны в Монго

Самый лучший вариант, я понял бы хранить эти шаблоны документов в Монго (возможно, я ошибаюсь ...)

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

Пример:

Template stored in Mongo: "Dear {{firstname}}" 
data context: {firstname: "Tom"} 

На сайте Тома, он должен читать: "Дорогой Том"

Как я могу это сделать?

EDIT

После некоторых исследований я обнаружил пакет под названием spacebars-компилятор, который приносит возможность компилировать клиенту:

meteor add spacebars-compiler 

Я тогда пытался что-то вроде этого:

Template.doctypesList.rendered = -> 
    content = "<div>" + this.data.content + "</div>" 
    template = Spacebars.compile content 
    rendered = UI.dynamic(template,{name:"nicolas"}) 
    UI.insert(rendered, $(this).closest(".widget-body")) 

но не работает.

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

EDIT 2

Я получаю ближе благодаря Тому.

Это то, что я сделал:

Template.doctypesList.rendered = -> 
    content = this.data.content 
    console.log content 
    templateName = "template_#{this.data._id}" 
    Template.__define__(templateName,() -> content) 
    rendered = UI.renderWithData(eval("Template.#{templateName}"),{name:"nicolas"}) 
    UI.insert(rendered, $("#content_" + this.data._id).get(0)) 

Это работает за исключением того, что имя не вводится в шаблон. UI.renderWithData делает шаблон, но без контекста данных ...

+0

Невозможно; см. http://stackoverflow.com/a/24743280/586086. Шаблоны в настоящее время скомпилированы на сервере, когда начинается Meteor, и вам придется отправить скомпилированную версию всем подключенным клиентам. Хорошая идея, хотя, если Meteor отправил шаблоны над публикациями, чтобы клиенты могли создавать новые шаблоны и делиться ими. –

+0

По-видимому, можно скомпилировать клиентскую сторону (см. Мое редактирование выше), но затем я застрял. Как я могу это сделать? – ndemoreau

+0

Почему бы вам просто не использовать 'Template [templateName]' вместо более запутанного 'eval (" Template. # {TemplateName} ")'? То, что вы делаете, должно работать, но убедитесь, что вы только определили шаблон один раз. –

ответ

0

Использование UI.dynamic: https://www.discovermeteor.com/blog/blaze-dynamic-template-includes/

Это довольно новый и не сделать свой путь к документации по какой-то причине.

+0

Я думаю, что он просит каким-то образом ввести шаблон в виде кода в стиле руля на клиенте и получить его скомпилированным и готовым к использованию.Это не то, что '{{> UI.dynamic}}' делает ... –

+0

@AndrewMao true that. Чтобы скомпилировать шаблон, вам либо нужно отправить космические аппараты клиенту, либо сохранить скомпилированную версию шаблонов в mongo. – imslavko

+0

. @mslavko spacebar-компилятор уже доступен на клиенте, не так ли? Он может сделать пакет и получить доступ к нему на клиенте. Интересно, будет ли сохранение скомпилированного шаблона правильным выбором. Я имею в виду, что сейчас Spacebars преобразует html в htmljs и использует Template.template_name.lookup для получения данных, это или что-то еще может измениться в будущем. Я думаю, для него лучше всего хранить шаблон в монго и скомпилировать его на клиенте. Поправьте меня, если я где-то ошибаюсь. – channikhabra

0

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

Вы, вероятно, уже используют underscore.js, если не Meteor имеет базовый пакет для него.

Вы можете использовать шаблоны подчеркиванием (http://underscorejs.org/#template), как это:

var templateString = 'Dear <%= firstname %>'

, а затем скомпилировать его с помощью

_.template(templateString, {firstname: "Tom"})

получить Dear Tom.

Конечно, вы можете хранить templateString в MongoDB тем временем.
Вы можете установить разделители на все, что хотите, <%= %> - это только по умолчанию.

+0

Хорошая идея, но я хотел бы придерживаться механизма моделирования темпа, хотя я хотел бы использовать некоторые функции Meteor. – ndemoreau

1

Что вам не хватает - это вызов (недокументированный!) Template.__define__, который требует имени шаблона (выберите что-то уникальное и умное) в качестве первого аргумента и функции рендеринга, которую вы получаете от вашего компилятора пробелов. Когда это будет сделано, вы можете использовать {{> UI.dynamic}} как предложено @Slava.

Существует также другой способ сделать это, используя API UI.Component, но, на мой взгляд, в настоящий момент это довольно неустойчиво, так что, возможно, я пропущу это, по крайней мере пока.

+0

Спасибо за этот отзыв. Это заставило меня добиться прогресса. У меня остался только один вопрос. См. Мое редактирование 2 в вопросе. Rgds – ndemoreau

0

Скомпилированный шаблон - это, по сути, обозначение htmljs. Метеор использует (или так я полагаю), и он использует Template.template_name.lookup для визуализации правильных данных. Проверьте консоль, если Template.template_name.lookup("data_helper")() вернет правильные данные.

Мне недавно пришлось решить эту точную (или аналогичную) проблему скомпилировать клиентскую часть шаблонов. Вы должны убедиться, что порядок вещей таков:

  • Составитель шаблон присутствует на клиенте
  • шаблона данных присутствует (проверьте с Template.template_name.lookup("data_name")())
  • Рендер шаблон на странице теперь

для компиляции шаблона, так как @apendua предложили использовать (это, как я использую его, и это работает для меня)

Template.__define__(name, eval(Spacebars.compile(
      newHtml, { 
       isTemplate: true, 
       sourceName: 'Template "' + name + '"' 
      } 
     ))); 

После этого вы должны убедиться, что данные, которые вы хотите визуализировать в шаблоне, доступны, прежде чем вы нарисуете шаблон на странице. Это то, что я использую для рендеринга шаблона на странице:

UI.DomRange.insert(UI.render(Template.template_name).dom, document.body); 

Хотя мой случай использования для рендеринга шаблонов на сторону клиента несколько отличается (моя задача состояла в том, чтобы жить обновить измененный шаблон переопределяем горячий код толчок метеора), но это работает лучший среди различных методов визуализации шаблона.

Вы можете проверить мой самый ранний пакет этап, который делает это здесь: https://github.com/channikhabra/meteor-live-update/blob/master/js/live-update.js

Я довольно новыми для реального мира программирования мой код может быть уродливым, но может быть это даст вам некоторые советы для решения твоя проблема. (Если вы обнаружите, что я делаю что-то глупое там или вижу что-то, что лучше сделать другим способом, пожалуйста, не стесняйтесь оставлять комментарий. Это единственный способ получить обратную связь для улучшения, поскольку я новичок и, по сути, один код, сидящий на моем темный угол).

 Смежные вопросы

  • Нет связанных вопросов^_^