Backbone.js系列教程一 - Backbone.js简介

JavaScript在web应用程序开发前端技术和后端技术的逻辑与运行一块占有越来越大的比重.为了帮助维护和循环访问前期逻辑和模块性,MVC模式在近几年中渐渐普及。其中一种运用广泛的MVC框架就是Backbone.js。

Backbone中的Models(模型)、Views(视图)和Controller(控制器)

Backbone.js包含以下几个主要功能:

  1. 创建模型(以及模型集合);
  2. 创建视图;
  3. 管理绑定,管理事件兼用不同的模型以及视图与框架其他部分的联系;
  4. 在模型中使用观察者模式,一旦模型触发任何change事件,所有显示此模型数据的视图接受到该change事件通知,从而自动进行事件重新渲染;
  5. 给DOM处理所依赖的jQuery或Zepto提供支持。

第一部分:模型(Models)

创建模型,首先我们创建一个包含数据的Person对象。


  1. Person = Backbone.Model.extend({
  2. // Person实例的构造函数
  3. initialize: function() {
  4. console.log("hello world");
  5. }
  6. });
  7.  
  8. var p = new Person();

很简单对吧?现在我们为这个Person对象添加一些参数,提供更多的数据,我们添加了姓名和身高属性。


  1. var p = new Person({name: "Matt", height:"6\"2""});
  2.  
  3. console.log(p.get("name"));

 如果我们不提供姓名和身高时,这个Person对象的这两个属性会为空,因此,我们现在为Person对象提供默认属性设置。


  1. Person = Backbone.Model.extend({
  2. initialize: function() {
  3. console.log("hello world");
  4. },
  5. defaults: {
  6. name: "Mark",
  7. height: "3\""
  8. }
  9. });
  10.  
  11. var p = new Person();
  12. p.set({name: "Matt", height: "6"2\""});
  13. console.log(p.get("name"));

 Backbone的绑定功能很强大,当Model数据变化的时候,能够自动的触发方法,更新视图View


  1. Person = Backbone.Model.extend({
  2. initialize: function() {
  3. console.log("hello world");
  4.  
  5. // 当name属性改变时,添加一个绑定函数
  6. this.bind("change:name", function() {
  7. console.log(this.get("name") + " is now the value for name");
  8. });
  9. },
  10. defaults: {
  11. name: "Bob Hope",
  12. height: "unknown"
  13. }
  14. });

 我们当然希望Backbone模型中的数据是有效的,因此我们添加error,validate方法来确保在创建对象前,数据是有效的。


  1. Person = Backbone.Model.extend({
  2. initialize: function() {
  3. console.log("hello world");
  4.  
  5. this.bind("change:name", function() {
  6. console.log(this.get("name") + " is now the value for name");
  7. });
  8.  
  9. // 添加一个和error错误绑定的方法,用于处理错误数据
  10. this.bind("error", function( model, error ) {
  11. console.error(error);
  12. });
  13. },
  14. defaults: {
  15. name: "Bob Hope",
  16. height: "unknown"
  17. },
  18. validate: function ( attributes ) {
  19. if( attributes.name == "Joe" ) {
  20. // 返回出错信息
  21. return "Uh oh, you"re name is Joe!";
  22. }
  23. }
  24. });
  25.  
  26. var person = new Person();
  27. person.set({name: "Joe", height:"6 feet"});
  28.  
  29. console.log(person.toJSON());

 第二部分:视图(Views)

HTML的样式:


  1. #container
  2. button Load
  3. ul#list
  4.  
  5. #list-template
  6. li
  7. a(href="")

Backbone 调用:


  1. // 一个简单的模型
  2. var Links = Backbone.Model.extend({
  3. data:[
  4. { text: "Google", href: "http://google.com" },
  5. { text: "Facebook", href: "http://facebook.com" },
  6. { text: "Youtube", href: "http://youtube.com" }
  7. ]
  8. });
  9.  
  10. var View = Backbone.View.extend({
  11. // 创建构造函数
  12. initialize: function () {
  13. console.log("init");
  14. }
  15. });
  16.  
  17. var view = new View();

 我们从视图的选项开始:


  1. var View = Backbone.View.extend({
  2. // options --> 提供给构造函数的对象
  3. initialize: function () {
  4. console.log(this.options.blankOption);
  5. }
  6. });
  7.  
  8. var view = new View({ blankOption: "empty string" });
  9. view.blankOption /// 会在console中打出“empty string。

 还有一些特殊预设置的options,el参数允许你将该视图附加到页面上已存在的元素。


  1. var View = Backbone.View.extend({
  2. initialize: function () {
  3. console.log(this.options.blankOption);
  4. // this.el -> #在DOM中列出
  5. }
  6. });
  7.  
  8. var view = new View({ el: $("#list") });

 你还可以建立一个新的元素:


  1. var View = Backbone.View.extend({
  2. initialize: function () {
  3. console.log(this.options.blankOption);
  4. // this.tagName --> create a "tagName" item in the DOM
  5. $("body").append(this.el)
  6. }
  7. });
  8.  
  9. var view = new View({ tagName: "div", className: "class", id: "", attributes: "" }); // --> creates a div tag with class "class"

 在这个步骤中,我们要使用一个静态的不变的目标


  1. var View = Backbone.View.extend({
  2. initialize: function () {
  3. console.log(this.el);
  4. },
  5. el: "#container"
  6. });
  7.  
  8. var view = new View({ model: new Links() }); //from first snippet

 然后添加一些事件操作:


  1. var View = Backbone.View.extend({
  2. initialize: function () {
  3. // do nothing
  4. // render() 会调用两次render
  5. },
  6. el: "#container",
  7. events: {
  8. "click button": "render"
  9. },
  10. render: function() { // 通常这个方法被Backbone调用
  11. var data = this.model.get("data");
  12.  
  13. for (var i=0, l=data.length; i<l; i++){
  14. var li = this.template
  15. .clone()
  16. .find("a")
  17. .attr("href", data[i].href)
  18. .text(data[i].text)
  19. .end();
  20. this.$el // <-- this.$el 是视图元素的jQuery对象, this.el 是DOM对象
  21. .find("ul#list").append(li);
  22. }
  23. }
  24. });
  25.  
  26. var view = new View({ model: new Links() });

 第三部分:路由器(Router)

路由器提供导航和控制,让我们发出指令到Web应用程序。添加sub-URLs或标签就能进行导航,还可以通过链接快速定位应用程序准确的特征。


  1. var Router = Backbone.Router.extend({
  2. routes: {
  3. // 这个会匹配任何url是符合foo/<param>的,并且提供:bar: 作为参数,传输到paramtest方法中
  4. // : 会匹配下一个URI
  5. // 所以#foo/1 会调用paramtest(1)
  6. "foo/:bar" : "paramtest",
  7.  
  8. / * 会匹配全部剩下的URI, 所以 #a/b/c 会调用 func("a/b/c")
  9. "*action" : "func"
  10. },
  11. func: function (action) {
  12. console.log(action);
  13. },
  14. paramtest:function (p) {
  15. console.log(p);
  16. }
  17. });
  18.  
  19. new Router();
  20.  
  21. Backbone.history.start();

第四部分:集合(Collections)

集合提供一种机制将多种实例模型组合起来,提供强大的功能特性来维护和收集数据到列表中。


  1. // 这是我们最初的person模型
  2. var Person = Backbone.Model.extend({
  3. // initialize在我们创建Person对象时被调用
  4. initialize: function() {
  5. console.log("Person is initialized.");
  6. },
  7.  
  8. // 默认属性
  9. defaults: {
  10. name: "undefined",
  11. age: "undefined"
  12. }
  13. });
  14.  
  15. // 创建集合!
  16. var People = Backbone.Collection.extend({
  17. // 当集合被创建时调用
  18. initialize: function() {
  19. console.log("People Collection is initialized");
  20. },
  21.  
  22. // 定义存入集合的数据模型
  23. model: Person
  24. });
  25.  
  26. // 创建一个新的Person对象
  27. var person = new Person({name:"Joe"});
  28.  
  29. // 建立一个集合,然后将Person对象加入这个集合中
  30. var people = new People(person);
  31. people.add([{name:"Bob"}, {name:"Jim"}]);
  32.  
  33. // 在控制台中,打出这个数据模型的数据
  34. console.log(people.toJSON());

于是我们就已经完成了包含了模型和视图的可用集合。

这是关于Backbone的MVC介绍,在下一篇中,我们会介绍它的具体用法,希望这对大家有所帮助。有任何问题,可以留言提问

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索view
, backbone
, function
, name
, console
, person
, backbone js
, js事件模型
, js事件处理模型
, JS创建事件
, |JS|SP|P简|简介|介|
console.error方法
backbone.js 教程、backbone.js菜鸟教程、backbone.js视频教程、backbone.js入门教程、backbone 教程,以便于您获取更多的相关知识。

时间: 2024-12-16 16:45:20

Backbone.js系列教程一 - Backbone.js简介的相关文章

Backbone.js系列教程二:Backbone.js深入解析之基础要求

在网上关于Backbone的描述很少,现有的关于Backbone的内容五花八门,基本上都不同程度的提到了如何运用Backbone来实现应用程序的创建,当然也有很多的是讨论它是否匹配Model/View/Whatever.有挺多华而不实的视频教程是讲程序设计的,但其实没有什么太大的价值.我认为关键是缺少了关于Backbone本身的详细介绍,以及对于每行代码的真正用意的细节描述.有篇文档专门讲述Backbone各部分的功能,在一定程度上解答了上述问题,并且提供带有注释的源代码,还有更多相关Backb

Backbone.js系列教程九:Backbone实用程序库

利用Backbone.noConflict()存储和创建一个特殊的(就是自定义命名空间)引用到Backbone 当Backbone被浏览器解析时,Backbone做的第一件事就是存储一个引用到包含在全局作用域(也就是window.Backbone)中 的Backbone的值.这是因为Backbone重写或占据了这个命名空间,希望给开发者机会去存储在Backbone被解析之前使用的初值.这就是 Backbone.noConflict()起作用的时候了.调用Backbone.noConflict()

Backbone.js系列教程四:Backbone全面介绍

Backbone的原理 Backbone的初衷在于单页面应用程序中添加架构,尤其是在创造DocumentCloud应 用程序的过程中,以避免重复性的DOM交叉以及DOM中用于保持UI同步的数据发生混乱.Backbone通过一套构造函数来完成这个步骤,于是就形成了 模型.集合与视图对象,目的在于组织应用程序的数据.逻辑和显示.一旦这些对象被具现化,它们彼此之间就存在特殊的关系,共同保证了应用程序的模块化.松 耦合性(利用event系统沟通).可扩展性. Backbone提供应用程序架构,还能帮助构

Backbone.js系列教程十:Backbone.View

在前几节中我们介绍了Backbone基础知识,如果你还没有阅读过,那么我建议你从第一节开始学习--Backbone.js系列教程一:Backbone.js初探,尤其希望你能完全理解构造Backbone对象相 关知识,这对于学习今后的内容有很大帮助.在接下来的几个小节中,我们将深入Backbone,讨论Backbone views.models和collections.相信大家在阅读前文之后,已经对Backbone.View.Backbone.Model. Backbone.Collection构

Backbone.js系列教程三:深入解析之框架,模型视图

Backbone下的框架设想 Backbone是用于开发SPA(AKA单页应用)环境.你可能想要知道这些是什么.简单的讲,SPA就是一个加载了一个页面 (index.html或者app.html)的web应用,整个应用通过自定义事件,自定义URL句柄,和异步HTTP检索,存储资源来发送到客户端, 这样避免了页面的重复加载.基本上,SPA框架只加载一个HTML页面,因此JavaScript可以用于仿写/重写/编排浏览器上传统web应用框架的 默认属性. 让我们检验Backbone SPA的框架假设

Backbone.js系列教程六:构造Backbone对象

Backbone构造函数 我之所以说Backbone很简单,是因为Backbone只有四个构造函数能被典型的实例化(基本上,它们首先被继承或子分类).这四种构造函数包括: Backbone.Model = function(attributes, {options}){}; Backbone.Collection = function([models], {options}){}; Backbone.Router = function({options}){}; //只能被具现化一次  Back

Backbone.js系列教程十二:Backbone.Collection

Backbone.Collection概述 一个Backbone集合表示了一组模型逻辑有序的组合,并提供使用(组合,分类,过滤)这些模型组的方法与属性.在本文中为了说明这样的联系关系 (模型=表单中的一行有标签的联系数据),你可以把一个集合看做是整张表单,其中包含了很多行联系数据.下面我更新了表单中联系内容的细节,在上一章节开 头我们讲述过,于是整张表单能够被当作一个联系表单. 当然,一个Backbone.Collection不仅仅是一个像之前表单表现的那种标签.集合还可以捕捉模型以及集合上被触

Backbone.js系列教程五:Backbone.Events

Backbone.Events概述 Backbone.Events对象包含的方法有助于observer设计模式和一个调用pub/sub的可变observer模式.这些功能允许Backbone创建的不同类的对象(JavaScript对象)彼此解耦而相互通信.这是通过扩展(也就是_.extend(Model.prototype, Backbone.Events);)以下构造函数而完成的,所使用的函数都属于Backbone.Events: Backbone.Model() Backbone.Colle

Backbone.js系列教程七:Backbone.Router

Backbone.router()概述 一个Backbone route是一个JavaScript字符串,类似于传统认识中的URL路径名. 这个像字符串的路径名是一个函数的属性名(或引用命名函数),当在浏览器中有url与字符串匹配时被调用.举例来说,下例中的url包含路径名 "help" ,在一个单独的Backbone应用页面中它将通告Backbone调用一个函数,这个函数关联了名为'help"的路由. http://www.hostname.com/#help 请注意,路径