【问题标题】:I look for template engine with special concept我寻找具有特殊概念的模板引擎
【发布时间】:2012-05-25 17:57:32
【问题描述】:

请您向我推荐一个实现下述特殊概念的 HTML 模板引擎(任何脚本语言)。

所有标记都处于活动状态。调用模板之前不应该准备数据,而是模板本身从模型中获取数据。例如

{CurrentUser.name} 将替换为当前登录用户的名称,因此我不需要在调用模板之前准备数据。

但我也可以指定一些“自定义”数据方法。例如,如果我必须制作相册,并且只需要显示一大块照片,我可以使用 {PhotosListPart.thumb.url} 并定义用于检索 PhotosListPart 的特殊方法,允许模板自动调用它并异步获取数据。

你知道任何支持这种模板方法的模板引擎/框架吗?

【问题讨论】:

  • 这听起来像是 JSP 自定义标签或原始 ASP,都是旧的,但两者都可以这样工作。现在我想到了,如果我传入一个上下文对象,我可以这样使用 Jade。数据是提前准备好还是在请求时获取取决于该对象的设计。
  • 什么模板引擎不能这样用?
  • @joshp 可以是任何引擎,但不是本机引擎。例如,Smarty 绝对需要将准备好的数据传递给模板引擎。我想拥有可以处理几乎任何系统对象的任何属性的活动模板。
  • @joshp 你能举一个 Jade 在这个概念中使用的例子吗?
  • 描述你想如何使用它。我无法想象你要如何编写没有视图的网络应用程序。

标签: php python templates node.js frameworks


【解决方案1】:

拉取视图是从控制器中拉取数据的视图(它反过来调用模型来查找数据)。

如果您严格遵守 MVC 模式[1],那么您将不会使用任何类型的 pull 视图。

但是 AFAIK 没有[2] 的模板引擎尊重 MVC,因为它们允许模板中的逻辑(if/foreach/函数调用等)。

没有任何模板引擎会预先编写代码来假设存在任何数据,但几乎所有模板引擎都允许您传递一个 巨大 数据数组,其中包含您在页面上需要的所有内容.

如果您需要一个模板引擎将数据预填充到变量中,那不是模板引擎,而是一个完整的应用程序,它包含与数据库或模型通信的逻辑,这使它远离模板引擎的概念。

[1] 当我们谈论模板引擎时,尊重 MVC 意味着使用 if 仅检查变量 是否设置,不应该存在 for/foreach 循环,范围通过将模板应用于集合对象来完成一组/项目列表,此处说明了这一点和其他问题:http://bit.ly/Jc3f0Z

[2] 除外:Java、C# 和 Python 中的 StringTemplateMoustache 支持多种语言,包括 JS/Node.js/Java/PHP/Python/Ruby。

编辑

使用视图类来准备数据,并使用模板文件来输出它们,因为名称变得混乱(视图是类+模板,模板是文件)。

这就是我将预处理类命名为“渲染器”并将模板文件命名为“模板”的原因,因此渲染器+模板 = 视图。作为一个名字和一种哲学,这对我来说更有意义。

我可以在渲染器中使用 money_format/number_format/html_escape 等,然后将已经渲染的数据输出到模板中。因此,我不会将渲染/查看操作与控制器混合。它们都在渲染器中完成。

【讨论】:

  • @Epsiloncool 出于好奇……您最后选择使用什么?命名你的毒男孩!
【解决方案2】:

是的,我了解仅 MVC 设计模式,但我无法想象您希望如何实现 url 路由并从中调用模板。例如,您从用户那里获得请求,如果您删除视图,则需要显示一些数据,您的所有业务逻辑都应该位于模型或模板或其他地方,如帮助程序,因此结果是 MVC,但视图被涂抹在三个或更多地方。但是如果你真的想这样做,你可以尝试使用 Mako 模板 http://www.makotemplates.org/ ,你可以根据需要直接在模板中编写 python 代码))

【讨论】:

  • 其实我可以在原生模板中编写 PHP 代码,但我不想要。我也不是说我们根本不需要视图,我只是说可以通过删除从中准备的数据并使用活动模板来显着缩小视图站点,而是直接访问模型。
  • 有了 mako,你可以通过一些小技巧来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2022-01-22
相关资源
最近更新 更多