我正在学习和使用Backbone.js的过程中。
我有一个项目模型和一个相应的项目视图。每个模型例程都有item_class和item_id属性,我希望将这些属性反映为相应视图的'id'和'class'属性。实现此目的的正确方法是什么?
示例:
var ItemModel = Backbone.Model.extend({
});
var item1 = new ItemModel({item_class: "nice", item_id: "id1"});
var item2 = new ItemModel({item_class: "sad", item_id: "id2"});
var ItemView = Backbone.View.extend({
});
我应该如何实现视图,以便视图的el 's将转换为:
<div id="id1" class="nice"></div>
<div id="id2" class="sad"> </div>
在我看到的大多数例子中,视图的el充当了一个无意义的 Package 器元素,在其中必须手动编写“语义”代码。
var ItemView = Backbone.View.extend({
tagName: "div", // I know it's the default...
render: function() {
$(this.el).html("<div id="id1" class="nice"> Some stuff </div>");
}
});
所以当渲染的时候
<div> <!-- el wrapper -->
<div id="id1" class="nice"> Some stuff </div>
</div>
但这似乎是一种浪费-为什么要有外部div?我想让el直接翻译成内部div!
8条答案
按热度按时间5rgfhyps1#
摘要:使用模型数据动态设置视图属性
http://jsfiddle.net/5wd0ma8b/
attributes
方法是在设置传递给视图构造函数的属性之后调用的(在本例中为model
),允许您在Backbone创建el
之前使用模型数据动态设置属性。render()
才设置属性值;不会在每次调用render()
时重复设置属性值;无需手动设置DOM元素的属性值。Backbone.View.extend
或视图构造函数(例如new Backbone.View
)时设置类,则必须使用DOM属性名称className
,但如果通过attributes
hash /方法(如本例中所示)设置类,则必须使用属性名称class
。声明视图时...
el
、tagName
、id
和className
现在可以定义为函数(如果您希望在运行时确定它们的值)。我之所以提到这一点,是因为在某些情况下,它可以作为使用
attributes
方法的替代方法,如图所示。使用现有元素
如果您使用的是现有元素(例如,将
el
传递给视图构造函数)......那么
attributes
将不会应用于该元素。如果所需的属性尚未在元素上设置,或者您不想在视图类和其他位置复制该数据,那么您可能需要在视图构造函数中添加一个initialize
方法,该方法将attributes
应用于el
。如下所示(使用jQuery.attr
):使用
el
,呈现,避免 Package在我看到的大多数例子中,视图的el充当了一个无意义的 Package 器元素,在其中必须手动编写“语义”代码。
没有理由
view.el
必须是“一个无意义的 Package 器元素”。事实上,这经常会破坏DOM结构。例如,如果一个视图类表示一个<li>
元素,需要将其呈现为<li>
--将其呈现为<div>
或任何其他元素将破坏内容模型。您'我很可能希望重点关注正确设置视图的元素(使用tagName
、className
和id
等属性),然后呈现其 * 内容 *。如何让你的 Backbone.js 视图对象与DOM交互的选项是完全开放的。有两个基本的初始场景:
有多种方法可以生成元素的内容(设置一个文字字符串,如示例中所示;使用模板库,如Mustache、Handlebars等)。如何使用视图的
el
属性取决于您正在执行的操作。现有元素
您的渲染示例表明您已经有一个元素要分配给视图,尽管您没有显示视图的示例化。如果是这种情况,并且该元素已经在文档中,那么您可能需要执行类似这样的操作(更新
el
的内容,但不要更改el
本身):http://jsfiddle.net/vQMa2/1/
生成的元素
假设你没有一个现有的元素,你让Backbone为你生成一个,你 * 可能 * 想做这样的事情(但是最好是架构一些东西,这样你的视图就不会知道它本身之外的任何东西):
http://jsfiddle.net/vQMa2/
模板
在我的例子中,我使用的是模板,例如:
模板表示完整的视图,换句话说,模板周围没有 Package 器--
div.player
将是我的视图的根元素或最外层元素。我的播放器类看起来像这样(非常简化的
render()
示例):zpgglvta2#
在你看来就做这样的事
ovfsdjhp3#
您可以在根元素上设置属性
className
和id
:http://documentcloud.github.com/backbone/#View-extendEDIT包含基于构造函数参数设置id的示例
如果视图按上述方式构建:
然后,可以按以下方式设置这些值:
jw5wzhpr4#
我知道这是一个老问题,但添加它是为了参考。在新的 Backbone.js 版本中,这似乎更容易。在Backbone 1.1中,id和className属性在函数
ensureElement
(见源代码)中使用下划线_.result
进行计算,这意味着如果className
或id
是一个函数,则将调用它,否则将使用它的值。因此,您可以直接在构造函数中给予className,提供将在className中使用的另一个参数,等等...有很多选项
所以这个应该能用
fumotvh35#
其他示例并没有展示如何从模型中获取数据。要从模型的数据中动态添加id和class:
nkcskrwz6#
您需要删除tagName并声明一个el。
'tagName'表示您希望 Backbone.js 创建一个元素。如果该元素已经存在于DOM中,您可以指定如下的el:
和更新版本:
atmip9wb7#
尝试在initialize方法中分配值,这将直接动态地将id和class分配给div属性。
qjp7pelc8#
下面是一个通过模型动态更改视图元素的类并在模型更改时更新它的最小方法。