Подтвердить что ты не робот

Scala/Подъемник - попытка понять, что одновременная заявка на лифтинг для использования действительного html и склонности к лифту: теги и переписывание меток в рендере

Все семь вещей (http://seventhings.liftweb.net/), безусловно, приятны, но я был особенно в восторге от претензии в Шаблонах (http://seventhings.liftweb.net/templates), что "Лифт поддерживает дизайнерские шаблоны".

Как один из моих шагов в обучении. Ликвидация способов делать вещи. Я пытаюсь создать простую форму создания объекта: возьмите несколько параметров, используйте их как аргументы конструктора, а затем уберите объект. После некоторых исследований и экспериментов, у меня есть две проблемы:

  • Кажется, существует значительная склонность к значительному переписыванию/приукрашиванию разметки шаблона в фрагментах.
  • Формы, похоже, не используют допустимые или узнаваемые элементы html.

Что я основываю на этом:

Образцы/документы формы, похоже, все об особых тегах: теги. Exploring Lift предполагает, что форма должна выглядеть так: (http://exploring.liftweb.net/master/index-6.html)

<lift:Ledger.add form="POST">
  <entry:description />
  <entry:amount /><br />
  <entry:submit />
</lift:Ledger.add>

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

Код примера demo.liftweb.net(1) предполагает, что ваш шаблон должен выглядеть так (2)

<lift:surround with="default" at="content">
  <div class="lift:PersonScreen"></div>
</lift:surround>

Код для фрагмента PersonScreen не точно освещает (3). Существует еще несколько примеров шаблона, который имеет, например, только тег ul в определенном месте только для генерации целой серии сложных li с вложенными элементами в фрагменте. Конечно, вы можете использовать xml в Scala, и он читает с терпением, но он все равно разбрасывает вашу разметку повсюду. Это, похоже, нарушает дух "дизайнерских шаблонов".

Что я хочу понять.

В течение долгого времени я строго придерживался двух правил в моей разработке webapp:

  • Отсутствует разметка в "коде" (контроллеры, бизнес-модели).
  • В шаблонах нет бизнес-логики.

Идиоматический лифт, кажется, полностью отвергает первое правило и полностью пропускает значение второго правила. Эти правила хорошо послужили мне, и я не готов просто следовать примерам, которые, по-видимому, нарушают их, не понимая, почему он не собирается создавать беспорядок. Я хочу понять, почему в "Lift" все в порядке, так что в фрагментах есть так много кода отображения. Я также хочу понять, почему все в порядке, что разметка в шаблонах так редко отражает результат.

Что я (думаю, я) хочу:

Я хочу, чтобы все мои разметки были очень небольшими, если таковые имеются, исключениями в моих шаблонах. Я хочу, чтобы мои фрагменты выполняли минимальное манипулирование шаблонами, обычно заменяя только текст элемента на тегах "листа" и, возможно, настраивая значения атрибутов. Я думаю, что я сделал это для достаточно сложного примера отображения, и я подозреваю, что могу использовать ту же технику для создания формы html ванили, а затем самостоятельно обрабатывать параметры. Это то, что мне нужно сделать, если я хочу, чтобы мой шаблон выглядел как форма конечного результата?

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

Спасибо!

ИЗМЕНИТЬ

В ответ на @OXMO456. (Спасибо за ответ.)

У меня есть, и они, похоже, просто подтверждают мои проблемы: например. мы начинаем с:

Подъемные шаблоны не содержат исполняемого кода. Это чистый, сырой, действительный HTML.

что является удивительным. Затем позже:

Последние два механизма для вызова фрагментов не приведут к действительным шаблонам Html5.

и все же каждый, кажется, использует первый из этих двух механизмов. Кроме того, в нем говорится:

В-третьих, дизайнерам не нужно беспокоиться о том, чтобы научиться программировать что-либо для разработки HTML-страниц, потому что выполнение программы абстрагируется от HTML, а не встроено в HTML.

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

Вторая ссылка полезна и поучительна, но она ясно показывает, что это не The Lift Way. Тем не менее, The Lift Way также, похоже, перетаскивает целую нагрузку разметки в фрагменты, что (я думаю) является огромным составом разметки и бизнес-логики. Это путь лифта?

4b9b3361

Ответ 1

Это теги старого стиля, а не дизайнерские теги.

<lift:MySnippet>
  <b:field />
</lift:MySnippet>

становится

<div class="lift:MySnippet">
  <div class="field"></div>
</div>

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

Кстати, в тегах старого стиля все эти поля сфабрикованы - они не являются частью стандартного набора тегов Lift. Я мог бы так же легко:

<lift:MySnippet>
  <frobnicate:blorb />
</lift:MySnippet>

пока мой код фрагмента ищет этот конкретный тег.

Подъем не допускает никакой логики в ваших шаблонах. Вся логика происходит в вашем классе Snippet. Таким образом, для примера, подобного дизайнеру, у меня может быть класс сниппета следующим образом:

 class MySnippet { 
   def render(in: NodeSeq): NodeSeq = ".field" #> Text("some text here")
 }

который даст этот результат:

 <div>
   <div class="field">some text here</div>
 </div>

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

Лифт отменяет правило, в котором вы не должны иметь никакой логики отображения в своем реальном коде. Зачем? Потому что это делает более многократно используемый код, потому что Scala имеет мощную поддержку XML, испеченную на этом языке, и потому, что вся ваша логика теперь рассматривается как простой старый код Scala.

Если я определяю фрагмент Lift под названием CurrentTime, я могу просто отбросить его в любой шаблон, и он отобразит текущее время - с фреймворками старой школы MVC, каждый метод действия должен установить время как переменную страницы и тогда мои шаблоны необходимо будет изменить, чтобы распечатать их. Для более сложной логики рамки старой школы, вероятно, потребуют условные условия в шаблонах. Подъем не позволяет этого - вся ваша логика - это обычный Scala код, подходящий для рефакторинга, легко проверяемый и совместимый с современными IDE.

Ответ 2

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

Кроме того, поскольку Lift следует своей первой парадигме зрения, единственное, что требуется на самом деле, - это обозначить, какие разделы разметки вы хотите обработать, в каких фрагментах рендеринга. Есть несколько способов, как иллюстрируют как OP, так и "Bill", но лично я предпочитаю:

<div lift="YourSnippet.method">
  <p>Some other code</p>
</div>

Это предпочтительнее, потому что вы не собираете атрибут класса, который (IMO) может ввести в заблуждение для дизайнеров. Подъемник может быть очень дружелюбным к дизайнеру, но я думаю, что главная проблема здесь заключается в том, что вы должны быть дисциплинированными при написании своих фрагментов, игнорируя многие доступные сегодня образцы, которые смешивают Scala и разметку.

Вас также может заинтересовать этот пост (http://blog.getintheloop.eu/2011/04/11/using-type-classes-for-lift-snippet-binding/); используя этот тип шаблона, вы можете определить разделенные, повторно используемые части логики рендеринга, сохраняя при этом свою бизнес-логику безопасно из фрагментов.

Наконец, и не желая бесстыдно продвигать мой собственный продукт, но я специально избегал использовать смешанные литералы Scala xml в моем примере кода для Lift in Action (кроме того, чтобы показать, что это возможно), возможно, возможно, это поможет, если вы посмотрите на Lift (http://manning.com/perrett/)