2014-10-22 3 views
0

Я исхожу из фона PHP, и я использовал фреймворки, такие как CakePHP и Laravel, и довольно легко работать с макетами и представлениями во всех них. А возможность использования PHP внутри этих шаблонных движков обеспечивает способ сделать такие вещи, как:Для поддержки циклов и макетов в шаблоне шаблона express.js

<?php for($i=0; $i<1000; $i++){ ?> 
    <td>demo</td> 
<? } ?> 

Теперь, начиная с узлом и express.js я узнал, шаблонные двигатели кажется довольно основным здесь. Я попытался HJS, Хоган, глоток, усы, рули ... ни один из них не предлагает как:

  • поддержки Layout (шаблоны и виды)
  • способа сделать петлю, как тот, который я назвал раньше.

Я что-то не хватает? Я слишком много прошу? Какой из них вы мне порекомендовали бы?

+0

Вы пробовали ** EJS **? –

+0

@ArunGhosh nop, но кажется [ему нужен еще один плагин для поддержки макета] (https://github.com/Soarez/express-ejs-layouts), правильно? – Alvaro

+0

Посмотрите http://www.embeddedjs.com/ –

ответ

2

Многие шаблоны для Javascript придерживаются философского мнения о том, что лучше обеспечить строгое разделение между логикой и презентацией, что означает, что сложность кода/логики, разрешенная в шаблоне, преднамеренно ограничена. Для краткого обзора этой темы см. http://blog.startifact.com/posts/older/the-new-hot-thing-in-web-development-client-side-templating-languages.html (речь идет о шаблонах на стороне клиента, но поскольку это Javascript, многие из тех же языков шаблонов являются популярными в node.js/Express). Эта идея логичных шаблонов существует и в мире PHP, но это не так часто.

Подробнее об этом читайте в этой статье: http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf. (Автор также является автором популярного механизма шаблонов для Java под названием StringTemplate.) Автор делает много хороших моментов, и в целом я согласен с идеей логичных шаблонов, но бывают случаи, когда это может быть неудобно, и я найти больше на заборе об этом ... см. this link для некоторых дополнительных соображений. Очевидно, есть и те, кто хочет иметь возможность чего-либо из шаблона (как вы можете в PHP) и полагать, что это прекрасно, чтобы полагаться на самоограничение программиста, чтобы не вводить слишком много кода в представление, где находится шаблон двигатели, такие как EJS.

Сказав все это, важно отметить, что то, что вы хотите достичь, возможно в Handlebars (что является одним из «безжизненных» языков) и, вероятно, многие из других, , Чтобы сделать это в Handlebars, вам нужно создать пользовательский помощник. Это может быть то, что вы ищете: использование

https://www.npmjs.org/package/handlebars-helper-repeat

Пример:

{{#repeat 10}} 
    {{> button }} 
{{/repeat}} 

Вы также можете продлить его, чтобы иметь возможность поддерживать аргументы, чтобы иметь возможность контролировать начальное число или приращение , хотя это, вероятно, будет входить в логику, которая может быть лучше сделана в JS-коде (в соответствии с философией Handlebars) при подготовке данных для шаблона.

Что касается макетов, то самое близкое в Handlebars (которое является механизмом шаблона, с которым я больше всего знаком) является частичным. Эта ссылка дает хорошее представление об этом: http://blog.teamtreehouse.com/handlebars-js-part-2-partials-and-helpers.

Лично я большой поклонник языка шаблонов в потрясающей структуре (построен на Express) под названием Derby.Его язык шаблонов похож на Handlebars, но поставляется с несколькими удобными расширениями - этого достаточно, чтобы сделать его более удобным для использования, не допуская слишком много логики, чтобы заполнить шаблон. К сожалению, я не думаю, что есть отдельная версия (т. Е. Вы должны использовать полную структуру Derby), но вы можете создавать собственные помощники в Handlebars для достижения аналогичного эффекта.

+0

P.S. Derby поддерживает макеты, а также поддерживает [компоненты] (http://derbyjs.com/0.5/views#components). –

+0

Если вы заинтересованы в рассмотрении решений на стороне клиента, вы также можете проверить [AngularJS] (https://angularjs.org/), если вы еще этого не сделали (но моим фаворитом все еще является Derby) , –