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 также, похоже, перетаскивает целую нагрузку разметки в фрагменты, что (я думаю) является огромным составом разметки и бизнес-логики. Это путь лифта?
Ответы
Ответ 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/)