Backbone的其实感觉上上手很难,大概在一年前就想实践下,结果总是没有付诸行动,这次需求中狠狠心决定一定要使用一次看看,感受下。
可是第一步真的比较困难,因为直接看API好像没有感觉就在网上找实例看看,但是我只能说有些人在给实例的时候根本就没有考虑过新手的感受。
我曾经在看完一些教程之后的迷惑:
1. 在view中this.model到底代表的是什么?
2. template如何写?
其实这两个问题很简单,可能就是一句话的事情,也许是我对于Backbone了解很少的缘故,我当时确实不明白。
下面上一点代码:
Model:
var TrendModel = Backbone.Model.extend({ urlRoot: ‘/price/trend.json‘ }); var trendM = new TrendModel();
这个Model很简单就是提供一个链接,根据这个链接可以获取价格趋势的数据
View:
var TrendView = Backbone.View.extend({ el: $(‘.js-report-tr‘), template: _.template($(‘#trendTemplate‘).html()), events: { // 单引号很重要,不然识别不了 ‘click .js-trend-show‘: ‘show‘ }, initalize: function() { // 确保this的正确作用域 _.bindAll(this, ‘render‘, ‘show‘); this.model.bind(‘change‘, this.render); }, render: function() { var el = this.template(this.model.attributes); $(this.el).parent().append(el); return this; }, show: function() { // 执行搜索操作,传递参数 this.model.fetch({ data: $.param({ comId: 111 }) }); } }); var trendV = new TrendView({ model: trendM });
看最后的3行,你就明白了model是指的什么了,其实model就是在创建View实例对象的时候传递的一个参数,而这个参数就是我上面定义的Model。
View包括几个部分:
el:我感觉就像一个容器或者说是执行环境上下文,应该怎么描述呢?举个例子吧,在backbone的view中我们经常这样查找元素
this.$el.find(‘.xx‘)
其实对应于jquery就是
$(‘.js-report-tr‘).find(‘.xx‘)
events:事件绑定,这里其实还是和el有点关联,例如在整个文档中有多个.js-trend-show元素,我们绑定事件的时候实际上是给.js-report-tr下的.js-trend-show元素绑定事件,其他的不在.js-report-tr的.js-trend-show都不会被绑定对应的事件。
注意点:
1. 事件方法名要加单引号,不然识别不了。
2. View中事件绑定应该使用的是事件代理。
template:模板,我当时看过几个模板的例子,但是就不知道模板是什么语言规则,后来其实我觉得自己是有点二了,实际模板就是一个js配合html的产物。backbone的模板有点像java混合jsp的感觉,有点混乱的感觉,当然好像<%%>可以自定义成其他的符号。
在使用Backbone中其实也遇到了一点问题
1. model.fetch操作是否将model的值设置成undefined
最开始的时候使用model.fetch后,在render中获取this.model是undefined,当时非常郁闷,想说get请求之后model被清空,那get干什么啊,后来查了下资料
使用_.bindAll(this,‘render‘),确保this的正确作用域。
好像有点混乱,下面做个总结吧
其实Backbone还有Router,Collections没有使用,所以对于Backbone只能是初步有了个了解,Backbone适用于单页面应用,我的实践其实有点纯粹想实验一下。
在这个实践中并没有体现Backbone的优势,但是依然可以让代码看起来更加模块化。
Backbone的一点使用心得,布布扣,bubuko.com
原文:http://www.cnblogs.com/z1029/p/3762322.html