Javascript 避免使用下划线模板重复-主干

Javascript 避免使用下划线模板重复-主干,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,假设我有一个主干模型,它有一组布尔属性: Car = Backbone.Model.extend({}); car_one = new Car({ a_c: true, mp3: true, gps: false, touchscreen: false, // etc... }) 我希望能够呈现这些布尔属性的列表,并在它们旁边有一个图标,具体取决于true或false。如果为true,图标将为绿色勾号,否则,显示红色X图标 类似于: <ul>

假设我有一个主干模型,它有一组布尔属性:

Car = Backbone.Model.extend({});

car_one = new Car({
    a_c: true,
    mp3: true,
    gps: false,
    touchscreen: false,
    // etc...
})
我希望能够呈现这些布尔属性的列表,并在它们旁边有一个图标,具体取决于true或false。如果为true,图标将为绿色勾号,否则,显示红色X图标

类似于:

<ul>
<li><img src="tick.png">AC</li>
<li><img src="tick.png">MP3</li>
<li><img src="cross.png">Gps</li>
<li><img src="cross.png">Touch screen</li>
</ul>

我有大约12个布尔属性需要这样呈现…

您可以从模板中访问JavaScript函数。因此,您可以在
窗口中放置一些内容(即全局范围):

然后,您将希望利用以下优势:

默认情况下,template通过
with
语句将数据中的值放入本地范围。但是,可以使用变量设置指定单个变量名。这可以显著提高模板渲染的速度

   _.template("<%= data.hasWith %>", {hasWith: 'no'}, {variable: 'data'});
   => "no"
演示:

通过使用
变量
选项,您将不得不说
,而不是
,但这是非常次要的

您可以使用类似的方法逐个格式化
  • 并在模板中保留更多HTML

    另一个选项是在模板中抛出一个
    for
    循环,如下所示:

    var html = _.template($('#t').html(), model.toJSON(), { variable: 'json' });
    // or
    var tmpl = _.template($('#t').html(), null, { variable: 'json' });
    var html = tmpl(model.toJSON());
    
    <script id="t" type="text/x-underscore-template">
        <ul>
            <% var fields = ['a_c', 'mp3', 'gps', 'touchscreen' ] %>
            <% for(var i = 0; i < fields.length; ++i) { %>
                <li class="<%= json[fields[i]] ? 'true' : 'false' %>"><%= fields[i] %></li>
            <% } %>
        </ul>
    </script>​​​​​​​​​​​​​​​​​​​​
    
    
    
    ​​​​​​​​​​​​​​​​​​​​
    演示:

    您会注意到,这还使用了
    变量:“json”
    选项,您需要它,以便在变量中使用
    []
    按名称获取字段。
    这样,您就可以从模板中访问JavaScript函数。因此,您可以在
    窗口中放置一些内容(即全局范围):

    然后,您将希望利用以下优势:

    默认情况下,template通过
    with
    语句将数据中的值放入本地范围。但是,可以使用变量设置指定单个变量名。这可以显著提高模板渲染的速度

       _.template("<%= data.hasWith %>", {hasWith: 'no'}, {variable: 'data'});
       => "no"
    
    演示:

    通过使用
    变量
    选项,您将不得不说
    ,而不是
    ,但这是非常次要的

    您可以使用类似的方法逐个格式化
  • 并在模板中保留更多HTML

    另一个选项是在模板中抛出一个
    for
    循环,如下所示:

    var html = _.template($('#t').html(), model.toJSON(), { variable: 'json' });
    // or
    var tmpl = _.template($('#t').html(), null, { variable: 'json' });
    var html = tmpl(model.toJSON());
    
    <script id="t" type="text/x-underscore-template">
        <ul>
            <% var fields = ['a_c', 'mp3', 'gps', 'touchscreen' ] %>
            <% for(var i = 0; i < fields.length; ++i) { %>
                <li class="<%= json[fields[i]] ? 'true' : 'false' %>"><%= fields[i] %></li>
            <% } %>
        </ul>
    </script>​​​​​​​​​​​​​​​​​​​​
    
    
    
    ​​​​​​​​​​​​​​​​​​​​
    演示:

    您会注意到,这还使用了
    变量:“json”
    选项,您需要它,以便在变量中使用
    []
    按名称获取字段。
    这些都是好东西,我一定会调查这些好东西,我一定会调查的