Backbone 是一个前端 JS 代码 MVC 框架,被著名的 37signals 用来构建他们的移动客户端。它不可取代 Jquery,不可取代现有的 template 库。而是和这些结合起来构建复杂的 web 前端交互应用。

如果项目涉及大量的 javascript 代码,实现很多复杂的前端交互功能,首先你会想到把数据和展示分离。使用 Jquery 的 selector 和 callback 可以轻松做到这点。但是对于富客户端的WEB应用大量代码的结构化组织非常必要。

Backbone 就提供了 javascript 代码的组织的功能。Backbone 主要包括 models, collections, views 和 events, controller 。

Models 用来创建数据,校验数据,存储数据到服务器端, Collections 包含你创建的 functions ,Views 用来展示数据。

Models 还可以绑定事件。比如用户动作变化触发 models 的 change 事件,所有展示此model 数据的 views 都会接收到 这个 change 事件,进行重绘。

事件的绑定和触发

以下是object 绑定 alert 事件和匿名回调函数的代码例子,object 之后 触发 alert 事件,并且传入参数 “an event”

var object = {};
 
_.extend(object, Backbone.Events);
 
object.bind("alert", function(msg) {
  alert("Triggered " + msg);
});
 
object.trigger("alert", "an event");

假如你的网页上事件很多也可以用proxy的方式来分发所有事件:

proxy.bind("all", function(eventName) {
  object.trigger(eventName);
});

Backbone 的 Models 是应用的核心

他包含了数据对象的属性,操作数据对象的函数。还实现和服务端交互的动作。

以下是定时从服务器端更新 channel 的数据:

// Poll every 10 seconds to keep the channel model up-to-date.
setInterval(function() {
  channel.fetch();
}, 10000);

以下是存储 book 的数据,这里通过重载 sync 函数,只让数据 alert 出来,sync 中的默认触发事件包括 fetch save refresh

Backbone.sync = function(method, model) {
  alert(method + ": " + JSON.stringify(model));
};
 
var book = new Backbone.Model({
  title: "The Rough Riders",
  author: "Theodore Roosevelt"
});
 
book.save();

Backbone 的 Controller 用来对 URL 和事件进行绑定

以下下例子中,分别将不同的以#开头的 URL 片段 绑定到不同的函数,实现服务器端 MVC 模型中的 router 一样的功能

var Workspace = Backbone.Controller.extend({
 
  routes: {
    "help":                 "help",    // #help
    "search/:query":        "search",  // #search/kiwis
    "search/:query/p:page": "search"   // #search/kiwis/p7
  },
 
  help: function() {
    ...
  },
 
  search: function(query, page) {
    ...
  }
 
});

值得提出的是 Backbone 的 router 也支持正则表达式的匹配

initialize: function(options) {
 
  // Matches #page/10, passing "10"
  this.route("page/:number", "page", function(number){ ... });
 
  // Matches /117-a/b/c/open, passing "117-a/b/c"
  this.route(/^(.*?)\/open$/, "open", function(id){ ... });
 
}

Backbone 的 Sync 默认通过调用Jquery的ajax方法来实现和服务器端的交互,实现数据的 CURD

比如 fetch 方法会触发 read 事件

Backbone 的 Views 用来接收用户的操作和修改 Model 的数据 ,另外通过 render 来展示数据

默认 render 并没有实现,你可以用 Mustache.js 或者 Underscore.js 来实现。

以下是接收用户操作的代码例子:

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});
  },
 
  ...
 
});

以下是数据渲染 render 的例子

var Bookmark = Backbone.View.extend({
  render: function() {
    $(this.el).html(this.template(this.model.toJSON()));
    return this;
  }
});

参考

http://documentcloud.github.com/backbone/

http://documentcloud.github.com/backbone/examples/todos/index.html

2010 Summary And 2011 Goals

为什么需要总结和计划

总结和计划总是让人喜悦或镇痛,一方面以前一段时间没有荒废,能给现在的行动以信心,另一方面看到一年的时间并不能完成很多事情,需要抓紧时间。让自己清醒总是好的。

这是一篇博客的截图:

很多年前看到这样的话:

明确地知道你的前进方向,可以增加目标完成的几率。

所以他制定了自己的年度目标,所以我制定了自己的年度目标。

这是他2010年的目标和完成情况,黑体代表完成。

他在2010年完成了: 再生一个小孩,赚到10万美元以上等等计划。足以看的计划的力量。

本来计划2011.1.1完成这个总结,但是一直拖到春节,拖到现在 :(

关于博客的总结

从  Archive for 2010 看, 在2010年发布了超过100篇博文。

Drupal开发

  1. Make your contributed drupal modules translatable in translate interface of i18n
  2. Make user inputed variables translatable in drupal
  3. Why drupal mail messy code
  4. How to switch database in Drupal
  5. Get parameters in url by arg(?) in Drupal
  6. How to set the module weight in Drupal
  7. Drupal theme block display issues
  8. Drupal Tips
  9. Drupal theme variables
  10. Drupal batch progress bar
  11. Create a progress bar in Drupal
  12. 5 tips you should know when building a Drupal theme
  13. How to show custom menu links to special roles in Drupal
  14. Drupal: Show different links to different roles
  15. Drupal: Show custom links as Primary / Secondary links.
  16. Workflow in Drupal

PHP 开发

  1. 服务器端PHP多进程编程实战
  2. Online php debug method
  3. How to get the file ext using PHP
  4. How to use include_once in PHP rightly
  5. XMLRPC example in PHP
  6. 10条测验自己PHP水平的语句
  7. PHP抓取外部资源函数fopen / file_get_contents / curl 的区别

Erlang 开发

  1. Get timestamp in Erlang
  2. How to update a value in mnesia database
  3. How to see the data in mensia database
  4. 最近-Erlang-XMPP-python
  5. HTTPCLIENT in Erlang
  6. Erlang xmlrpc example
  7. Erlang GUI tools
  8. 项目迭代:Erlang代码热替换以及Mnesia表结构修改
  9. Erlang redis library

敏捷开发

  1. Something about agility development
  2. 敏捷过程方法
  3. 如何提高敏捷开发效率
  4. Selenium进行web自动化测试
  5. Windows linux development environment settings
  6. 高效程序调试和测试方法
  7. 增强沟通技巧和提高开发效率
  8. 互联网产品交互设计需要遵循的几个原则

JAVA 开发

  1. Java程序优化过程及linux相关
  2. Java nio 实现的爬虫性能
  3. Add log4j for your servlet apps
  4. Using *.properties files in your servlet or webapp

其他

  1. How to watch the real time bandwidth in Linux
  2. 7 questions to ask yourself before starting the business online
  3. How to debug xmlrpc?
  4. Debug javascript or do automatic javascript testing
  5. 3 Tips of linux uses and 1 tip of Jquery
  6. 网站前端性能优化之CSS Sprite
  7. Some interesting stuff for you
  8. 创业团队4条箴言

关于2010年个人计划的完成

这是 2010年粗略计划:2010勇往直前 完成情况,其中灰色表示Archive。

1.增强关注领域

Marketing 完成

Finace 未完成

项目管理 完成50%

Social information 完成

Worldwide business 未完成

2.增强 时间管理 完成

3.习惯 快速做决定 完成50%

4.改善生活习惯 未完成

其他长期计划的完成

1.  领结婚证 完成

2. 贷款买房 完成

3. Body building 未完成

4. Improve my communicate skill 完成50%

5. More and more friends 未完成

从Google 搜索历史统计看

一月份到五月份第一个项目的架构逐渐稳定,只有大量的功能实施,迭代增加功能和debug的工作。所以搜索次数减少很多。

从六月份到十二月份,由于新项目的启动,需要很多研究分析,并且随着项目的展开,越来越多的问题需要解决,搜索次数逐渐增加。

工作日搜索量几乎没有很多差别,周六由于休息搜索量最低,周日稍增加。

从SVN统计看

在2010年,项目A提交次数接近1000次,项目B提交次数接近400次。

2011年目标

积极买对变化和挑战

1. 深入IOS , Android开发

2. 关注产品的网络营销

3. 项目1,2,3的开发和营销的0突破

4. Improve Algorithm and Linux C

5. 继续关注 Marketing, Social information, BI

6. 换一个拥有大数据量的环境?

近期Web项目的开发和运营的经验,以下几条适合小型团队在资源和时间都有限的情况下做高效开发:

1. 快速开发和迭代

应该在最短时间内验证一个feature或者一个想法行得通还是不容易实现。这样还有时间进行系统的重新设计。最先验证feature中的关键点是否可行,再将所有关键点进行串联,和系统整合。

2. 提早进入运营和市场

我们都工作在互联网时间,每天互联网都在发生翻天覆地的变化,不进则退。同样的创意,世界上有很多团队在把它变成产品。

3. 高效运行

将现有系统尽可能的做得快速运行,减少数据冗余。以备以后需求增长中执行速度变慢。

4. 容错和并行化

每个请求,数据返回都可能失败或成功,需要不定的时间长度。所以系统要尽可能做到并行,容错。互联网项目尤其是这样,网络环境不是可信环境。

5. 易于维护和管理

项目中期应该做到容易监控和维护。