从 Backbone.View 中分离模板逻辑

Posted

技术标签:

【中文标题】从 Backbone.View 中分离模板逻辑【英文标题】:Separating template logic from Backbone.View 【发布时间】:2012-03-11 01:44:08 【问题描述】:

我刚开始学习 Backbone.js,并且一直致力于(还有什么)一个简单的待办事项应用程序。在这个应用程序中,我想在<ul id="unfinished-taks"></ul> 中显示我的待办事项,每个任务都作为<li> 元素。到目前为止,一切都很简单。

根据我阅读的教程,我应该使用以下内容创建一个视图:

// todo.js
window.TodoView = Backbone.View.extend(
    tagName: 'li',
    className: 'task',
    // etc...
);

这很好用,但是在我的 javascript 代码中定义我的待办事项的 html 标记结构似乎是一种不好的做法。我宁愿完全在模板中定义标记:

// todo.js
window.TodoView = Backbone.View.extend(
    template: _.template($("#template-task").html()),
    // etc...
);

<!-- todo.html -->
<script type="text/template" id="template-task">
    <li class="task <%= done ? 'done' : 'notdone' %>"><%= text %></li>
</script>

但是,如果我这样做,Backbone.js 默认使用tagName: 'div' 并将我所有的待办事项包装在无用的&lt;div&gt; 标记中。有没有办法让 HTMl 标记完全包含在我的模板中,而无需在每个视图元素周围添加无意义的 &lt;div&gt; 标记?

【问题讨论】:

【参考方案1】:

如果你只打算渲染一次视图,你可以在.initialize()中手动设置视图的el属性:

// todo.js
window.TodoView = Backbone.View.extend(
    template: _.template($("#template-task").html()),

    initialize: function() 
        this.el = $(this.template(this.model.toJSON())).get(0);
    ,

    // etc
);

这里有一些警告:

Backbone 期望 el 属性是单个元素。我不确定如果您的模板在根中有多个元素会发生什么,但它可能不会是您所期望的。

这里重新渲染很困难,因为重新渲染模板会给你一个全新的 DOM 元素,你不能使用$(this.el).html() 来更新现有元素。因此,您必须以某种方式将新元素粘贴到旧元素的位置,这并不容易,并且可能涉及您不希望在.render() 中出现的逻辑。

如果您的 .render() 函数不需要再次使用模板(例如,您可能使用 jQuery 手动更改类和文本),或者您不需要,则这些不一定是显示停止器重新渲染。但是,如果您希望在模型更改时使用 Backbone 的标准“重新渲染模板”方法来更新视图,那将会很痛苦。

【讨论】:

呃,不是我想要的答案,但如果是这样的话,我想我必须要么处理它,要么使用除 Backbone 之外的其他东西

以上是关于从 Backbone.View 中分离模板逻辑的主要内容,如果未能解决你的问题,请参考以下文章

将依赖于 Web 引用的业务逻辑从表示层中分离出来

在 Delphi 中分离数据访问、业务逻辑和 GUI 的任何建议

在另一个类中分离 FloatingActionButton 逻辑

使用 webpack 在 vuejs 中分离模板

从 Access 应用程序中分离出组件 VB

在 Flask 中分离 html 和 JavaScript [重复]