【问题标题】:Haml interpolation with underscore template variable带下划线模板变量的 Haml 插值
【发布时间】:2013-01-17 20:27:41
【问题描述】:

我试图在我的 haml 模板中输出一个下划线模板变量,但我没有任何运气。

HTML 没有被转义,所以我似乎无法弄清楚为什么下划线变量没有呈现。

HAML - 完整模板

%script{:type => "text/template", :id => "user_list_template"}
  %h4 Users
  #test
  %table.table.table-bordered
    %thead
      %tr
        %th #
        %th Name
        %th Nickname
        %th
          %tbody
          {{ _.each( users, function(user) { }}
            %tr
              %td {{= user.get('id') }}
              %td {{= user.get('name') }}
              %td {{= user.get('nickname') }}
              %td 
                %a.btn{:href => "{{= user.get('nickname') }}"}
                  View User
          {{ }); }}

来源

<tr>
  <td>9</td>
  <td>TacoHell</td>
  <td>TacoHelll</td>
  <td>
    <a class="btn" href="<%= user.get('nickname') %>">
      View User
    </a>
  </td>
</tr>

模板的控制台日志

<h4>Users</h4>
<div id='test'></div>
<table class='table table-bordered'>
  <thead>
    <tr>
      <th>#</th>
      <th>Name</th>
      <th>Nickname</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
  {{ _.each( users, function(user) { }}
    <tr>
      <td>{{= user.get('id') }}</td>
      <td>{{= user.get('name') }}</td>
      <td>{{= user.get('nickname') }}</td>
      <td>
        <a class='btn' href="{{= user.get('nickname') }}">
          View User
        </a>
      </td>
    </tr>
  {{ }); }}
  </tbody>
</table>

我已经阅读了之前提出的问题,但无法让它发挥作用。有什么想法吗?

编辑 1 添加完整模板

编辑 2 模板的console.log

【问题讨论】:

  • 你说他们的 HTML 没有被转义,但随后有 href="/&amp;lt;%= user.get('nickname') %&amp;gt;" &lt;&gt; 被转义。您是否按照链接中的建议将 :escape_attrs 选项设置为 false?
  • @matt - 这是一个错误,我的错误。它们应该是实际的字符。
  • 有人知道如何解决代码块问题,@machineghost 在 1 月 17 日 23:55 提到的 {{}} 错误吗?还是把手是答案?
  • 你有没有得到这个工作?

标签: backbone.js haml underscore.js


【解决方案1】:

这与其说是一种解决方案,不如说是一种变通方法,但一种替代方法是为您的下划线模板使用不同的语法(不涉及&lt;&gt; 的语法)。如果你看:

http://documentcloud.github.com/underscore/#template

您会发现它们提供了替代 Django/Mustache 样式模板语法的示例:

如果您不喜欢 ERB 样式的分隔符,您可以更改 Underscore的模板设置使用不同的符号来衬托 插值代码。定义插值正则表达式以匹配表达式 应该逐字插入,一个要匹配的转义正则表达式 应在 HTML 转义后插入的表达式,以及 评估正则表达式以匹配应该在没有的情况下评估的表达式 插入结果字符串。您可以定义或省略任何 三者的结合。例如,执行 Mustache.js 样式 模板:

_.templateSettings = {
  interpolate : /\{\{(.+?)\}\}/g
};

var template = _.template("Hello {{ name }}!");
template({name : "Mustache"});
=> "Hello Mustache!"

当然,如果您正在考虑寻找更强大的模板系统,那么放弃_.template 并改用 Mustache、Handlebars 或类似的模板系统肯定不会有什么坏处。但如果您对 Underscore 感到满意,_.templateSettings.interpolate 将允许您在不使用 &lt;&gt; 的情况下使用它。

【讨论】:

  • %tbody {{ _.each( users, function(user) { }} %tr %td {{= user.get('id') }} %td {{= user.get('name') }} %td {{= user.get('nickname') }} %td %a.btn{:href =&gt; "{{= user.get('nickname') }}"} View User {{ }); }}
  • Uncaught SyntaxError: Unexpected token )
  • 不用担心(仅供参考,您也可以编辑答案以“更漂亮”的格式添加类似的信息)。至于错误,听起来好像不喜欢您的模板;你有机会粘贴到模板本身吗?
  • 我将完整的模板添加到我的 OP 中。
  • 另外,开始使用 Require.js 和 Handlebars 或 Mustache 会更容易吗?我不清楚如何开始整合它们。
猜你喜欢
  • 2023-03-19
  • 2013-08-26
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多