Backbone.VIew 学习笔记

Backbone.VIew 

它不影响任何的HTML或CSS代码,并且可以任意javascript模板引擎兼容。

将界面组织到逻辑视图,之后是模型,当模型数据发生改变,视图立刻自动更新,这一切都不需要重绘页面。

不必钻进JSON对象中,查找 DOM元素,手动更新HTML,可以绑定视图的render函数到模型的change事件

创建自定义的视图类。通常我们需要重载render 函数,声明事件,通过tagName,className或id为视图指定根元素

var DocumentRow = Backbone.View.extend({

  tagName: "li",

  className:"document-row",

  events:{

    "click .icon":    "open",

    "click .button.edit":   "openEditDialog",

    "click .button.delete":  "destory" 

  },

  render:function(){

  }

});


constructor/initialize     new View

每次实例化一个视图时,传入的选项参数会被注册到this.options中以备后用。

model,collection el  id  className tagName    视图实例化时该函数立即执行。如果不希望创建一个指向DOM


var doc = Documents.first();


new DocumentRow({

  model:  doc,

  id:  "document-row-" + doc.id

});


el   view.el 

所有视图都拥有一个DOM元素(el属性),不管元素在不在页面中,可以在任何时候渲染,然后一次性插入DOM中去,这样能尽量减少reflows和repaints从而获得高性能的UI渲染。      this.el  可以从视图的tagName,className,以及id属性创建,如果不都未指定,为一个div.


如果已存在,直接设置为真实的DOM元素或css选择字符串

view.$

每个视图都将拥有$函数,可以在视图元素查询作用域内运行. 等价于运行$(selector,this.el)


ui.Chapter = Backbone.View.extend({

  serialize: function(){

    return {

      title: this.$(".title").text()

          

    }

  }

});


render    view.render

重新渲染视图模板。使用新的html更新this.el    

var Bookmark = Backbone.View.extend({

  render: function(){

    $(this.el).html(this.template(this.model.toJSON()));

    return this;

  }

});


无论基于什么时候考虑,都永远不要在Javascript中拼接HTML字符串

remove   view.remove()

从DOM中移除视图       $(view.el).remove();


make view.make(tagName,[attribute],[content])

借助给定的元素类型,经及可选的attributes和HTML内容创建DOM元素。通常用于内部创建初始

var view = new Backbone.View;

var el = view.mak("b",{className:"bold"},"Bold!");

$('#make-demo').append(el);


delegateEvents   delegateEvents([events])

采用jQuery的delegate函数来为视图内的DOM事件提供回调函数声明。如果未传入events对象,使用this.events作为为事件源

视图 渲染 期间使用 delegateEvents 相比用 jQuery 向子元素绑定事件有更多优点。 所有注册的函数在传递给 jQuery 之前已被绑定到视图上,因此当回调函数执行时,this 仍将指向视图对象。 当 delegateEvents 再次运行,此时或许需要一个不同的 events 对象,所以所有回调函数将被移除,然后重新委托 — 这对模型不同行为也不同的视图挺有用处。

var DocumentView = Backbone.View.extend({

  events: {
    "dblclick"                : "open",
    "click .icon.doc"         : "select",
    "contextmenu .icon.doc"   : "showMenu",
    "click .show_notes"       : "toggleNotes",
    "click .title .lock"      : "editAccessLevel",
    "mouseover .title .date"  : "showTooltip"
  },

  render: function() {
    $(this.el).html(this.template(this.model.toJSON()));
    return this;
  },

  open: function() {
    window.open(this.model.get("viewer_url"));
  },

  select: function() {
    this.model.set({selected: true});
  },

  ...

});

Utility Functions

oConflictvar backbone = Backbone.noConflict();
返回 Backbone 对象的原始值。通常用于在第三方网站上引入了多个 Backbone 文件,避免冲突。

var localBackbone = Backbone.noConflict();
var model = localBackbone.Model.extend(...);


posted @ 2011-12-21 18:57  顺武  阅读(4340)  评论(0编辑  收藏  举报