作为一个轻量级MVC框架,如果是与后端交互比较频繁的站点使用这个框架,其效果是很显著的。从我个人角度而言,这个框架适合微博这类的实时性比较强并且牵扯用户信息比较多的网站,据说豆瓣的阿尔法城也是用这个框架做的。
如果从它的原理出发,我觉得是模仿或抄袭了ActionScript的PureMVC框架,但又有自己的特点,因为它融合了HTML DOM的特征,这点从它视图的events中可以看出。框架应该是从event配置中,寻找了事件后的选择器,然后把该事件绑了上去。参数传递无非就是apply或call,不出其右。
- window.EmployeeView = Backbone.View.extend({
- tagName : 'tr',
- template : _.template($('#item-template').html()),
- events : {
- "dblclick td" : "edit",
- "blur input,select" : "close",
- "click .del" : "clear",
- },
- initialize : function(){
- // 每次更新模型后重新渲染
- this.model.bind('change', this.render, this);
- // 每次删除模型之后自动移除UI
- this.model.bind('destroy', this.remove, this);
- },
- setText : function(){
- var model = this.model;
- this.input = $(this.el).find('input,select');
- this.input.each(function(){
- var input = $(this);
- input.val(model.get(input.attr("name")));
- });
- },
- close: function(e) {
- var input = $(e.currentTarget);
- var obj = {};
- obj[input.attr('name')] = input.val();
- this.model.save(obj);
- $(e.currentTarget).parent().parent().removeClass("editing");
- },
- edit : function(e){
- // 给td加上editing样式
- $(e.currentTarget).addClass('editing').find('input,select').focus();
- },
- render: function() {
- $(this.el).html(this.template(this.model.toJSON()));
- // 把每个单元格的值赋予隐藏的输入框
- this.setText();
- return this;
- },
- remove: function() {
- $(this.el).remove();
- },
- clear: function() {
- this.model.destroy();
- }
- });
最牛逼的当是它的模板工具,个人认为这个模板工具是这个框架最有价值的地方,对于占位符的处理相当不错,模板的建立就像写jsp页面模板差不多。
- <script type="text/template" id="item-template">
- <td><%= eid %></td>
- <td class="username">
- <div class="display"><%= username %></div>
- <div class="edit"><input class="username" name="username"></input></div>
- </td>
- <td class="sex">
- <div class="display"><%= sex=="1" ? "女":"男" %></div>
- <div class="edit">
- <select name="sex" class="sex" style="width:45px">
- <option value="0">男</option><option value="1">女</option>
- </select>
- </div>
- </td>
- <td class="age">
- <div class="display"><%= age %></div>
- <div class="edit">
- <input class="age" name="age"></input>
- </div>
- </td>
- <td class="position">
- <div class="display"><%= position %></div>
- <div class="edit">
- <input class="position" name="position"></input>
- </div>
- </td>
- <td>
- <a href="#" class="del">删除</a>
- </td>
- </script>
它的缺点也很明显,因为页面更新全依赖于JSON,如果禁掉JS,或者这些JS与浏览器中的某些插件起冲突,其后果也是很明显的,对于银行等这类需要考虑JS禁掉情况的站点来说,是不合适的。另外对于不需要M或C的单个页面来说,用这个有时反倒多余,很多API用不上。因此这个得看情况使用,如果全部页面都使用这个框架,则不太合理。尤其是手机网站,在中国这个流量比较贵的国度,页面上不用的代码最好不要有。