写在前面
Backbone的加载
<script src="/javascripts/lib/jquery.js"></script>
<script src="/javascripts/lib/underscore.js"></script>
<script src="/javascripts/lib/backbone.js"></script>
<script src="/javascripts/jst.js"></script>
<script src="/javascripts/router.js"></script>
<script src="/javascripts/init.js"></script>
正文
Backbone.View的基本用法
Backbone.View方法用于定义视图类。
var AppView = Backbone.View.extend({
render: function(){
$('main').append('<h1>一级标题</h1>');
}
});
上面代码通过Backbone.View的extend方法,定义了一个视图类AppView。该类内部有一个render方法,用于将视图放置在网页上。
使用的时候,需要先新建视图类的实例,然后通过实例,调用render方法,从而让视图在网页上显示。
var appView = new AppView();
appView.render();
上面代码新建视图类AppView的实例appView,然后调用appView.render,网页上就会显示指定的内容。
新建视图实例时,通常需要指定Model。
var document = new Document({
model: doc
});
initialize方法
视图还可以定义initialize方法,生成实例的时候,会自动调用该方法对实例初始化。
var AppView = Backbone.View.extend({
initialize: function(){
this.render();
},
render: function(){
$('main').append('<h1>一级标题</h1>');
}
});
var appView = new AppView();
上面代码定义了initialize方法之后,就省去了生成实例后,手动调用appView.render()的步骤。
el属性,$el属性
除了直接在render方法中,指定“视图”所绑定的网页元素,还可以用视图的el属性指定网页元素。
var AppView = Backbone.View.extend({
el: $('main'),
render: function(){
this.$el.append('<h1>一级标题</h1>');
}
});
上面的代码与render方法直接绑定网页元素,效果完全一样。上面代码中,除了el属性,还是$el属性,前者代表指定的DOM元素,后者则表示该DOM元素对应的jQuery对象。
tagName属性,className属性
如果不指定el属性,也可以通过tagName属性和className属性指定。
var Document = Backbone.View.extend({
tagName: "li",
className: "document",
render: function() {
// ...
}
});
template方法
视图的template属性用来指定网页模板。
var AppView = Backbone.View.extend({
template: _.template("<h3>Hello <%= who %><h3>"),
});
上面代码中,underscore函数库的template函数,接受一个模板字符串作为参数,返回对应的模板函数。有了这个模板函数,只要提供具体的值,就能生成网页代码。
var AppView = Backbone.View.extend({
el: $('#container'),
template: _.template("<h3>Hello <%= who %><h3>"),
initialize: function(){
this.render();
},
render: function(){
this.$el.html(this.template({who: 'world!'}));
}
});
上面代码的render就调用了template方法,从而生成具体的网页代码。
实际应用中,一般将模板放在script标签中,为了防止浏览器按照JavaScript代码解析,type属性设为text/template。
<script type="text/template" data-name="templateName">
<!-- template contents goes here -->
</script>
可以使用下面的代码编译模板。
window.templates = {};
var $sources = $('script[type="text/template"]');
$sources.each(function(index, el) {
var $el = $(el);
templates[$el.data('name')] = _.template($el.html());
});
events属性
events属性用于指定视图的事件及其对应的处理函数。
var Document = Backbone.View.extend({
events: {
"click .icon": "open",
"click .button.edit": "openEditDialog",
"click .button.delete": "destroy"
}
});
上面代码中一个指定了三个CSS选择器的单击事件,及其对应的三个处理函数。
listento方法
listento方法用于为特定事件指定回调函数。
var Document = Backbone.View.extend({
initialize: function() {
this.listenTo(this.model, "change", this.render);
}
});
上面代码为model的change事件,指定了回调函数为render。
remove方法
remove方法用于移除一个视图。
updateView: function() {
view.remove();
view.render();
};
子视图(subview)
在父视图中可以调用子视图。下面就是一种写法。
render : function (){
this.$el.html(this.template());
this.child = new Child();
this.child.appendTo($.('.container-placeholder').render();
}