Backbone.js框架中Model与Collection的使用实例


Posted in Javascript onMay 07, 2016

Model
关于backbone,最基础的一个东西就是model,这个东西就像是后端开发中的数据库映射那个model一样,也是数据对象的模型,并且应该是和后端的model有相同的属性(仅是需要通过前端来操作的属性)。
下面就从实例来一步一步的带大家来了解backbone的model到底是什么样的一个东西。
首先定义一个html的页面:

<!DOCTYPE html>
<html>
<head>
<title>the5fire-backbone-model</title>
</head>
<body>
</body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/underscore.js/1.1.4/underscore-min.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/backbone.js/0.3.3/backbone-min.js"></script>
<script>
(function ($) {
/**
 *此处填充代码
 **/
})(jQuery);
</script>
</html>

下面的代码需要填到这个html的script标签中的function中。

1、最简单的一个对象

Man = Backbone.Model.extend({
    initialize: function(){
      alert('Hey, you create me!');
    }
  });
var man = new Man;

这个就很简单了,在helloworld里面也有了一个model的展现,不定义了属性,这里是一个 初始化时的方法,或者称之为构造函数。​​

2、对象赋值的两种方法
第一种,直接定义,设置默认值。

Man = Backbone.Model.extend({
  initialize: function(){
    alert('Hey, you create me!');
  },
  defaults: {
    name:'张三',
    age: '38'
  }
});

var man = new Man;
alert(man.get('name'));

第二种,赋值时定义

Man = Backbone.Model.extend({
  initialize: function(){
    alert('Hey, you create me!');
  }
});
man.set({name:'the5fire',age:'10'});
alert(man.get('name'));

取值的时候都是用get。

3、对象中的方法

Man = Backbone.Model.extend({
  initialize: function(){
    alert('Hey, you create me!');
  },
  defaults: {
    name:'张三',
    age: '38'
  },
  aboutMe: function(){
    return '我叫' + this.get('name') + ',今年' + this.get('age') + '岁';
  }
});
var man = new Man;
alert(man.aboutMe());

4、监听对象中属性的变化

Man = Backbone.Model.extend({
  initialize: function(){
    alert('Hey, you create me!');
    //初始化时绑定监听
    this.bind("change:name",function(){
      var name = this.get("name");
      alert("你改变了name属性为:" + name);
    });
  },
  defaults: {
    name:'张三',
    age: '38'
  },
  aboutMe: function(){
    return '我叫' + this.get('name') + ',今年' + this.get('age') + '岁';
  }
});
var man = new Man;
man.set({name:'the5fire'}) //触发绑定的change事件,alert。

5、为对象添加验证规则,以及错误提示

Man = Backbone.Model.extend({
  initialize: function(){
    alert('Hey, you create me!');
    //初始化时绑定监听
    this.bind("change:name",function(){
      var name = this.get("name");
      alert("你改变了name属性为:" + name);
    });
    this.bind("error",function(model,error){
      alert(error);
    });
  },
  defaults: {
    name:'张三',
    age: '38'
  },
  validate:function(attributes){
    if(attributes.name == '') {
      return "name不能为空!";
    }
  },
  aboutMe: function(){
    return '我叫' + this.get('name') + ',今年' + this.get('age') + '岁';
  }
});
var man = new Man;
man.set({name:''}); //根据验证规则,弹出错误提示。

6、对象的获取和保存,需要服务器端支持才能测试。
首先需要为对象定义一个url属性,调用save方法时会post对象的所有属性到server端。

Man = Backbone.Model.extend({
  url:'/save/',
  initialize: function(){
    alert('Hey, you create me!');
    //初始化时绑定监听
    this.bind("change:name",function(){
      var name = this.get("name");
      alert("你改变了name属性为:" + name);
    });
    this.bind("error",function(model,error){
      alert(error);
    });
  },
  defaults: {
    name:'张三',
    age: '38'
  },
  validate:function(attributes){
    if(attributes.name == '') {
      return "name不能为空!";
    }
  },
  aboutMe: function(){
    return '我叫' + this.get('name') + ',今年' + this.get('age') + '岁';
  }
});
var man = new Man;;
man.set({name:'the5fire'});
man.save(); //会发送POST到模型对应的url,数据格式为json{"name":"the5fire","age":38}
//然后接着就是从服务器端获取数据使用方法fetch([options])
var man1 = new Man;
//第一种情况,如果直接使用fetch方法,那么他会发送get请求到你model的url中,
  //你在服务器端可以通过判断是get还是post来进行对应的操作。
man1.fetch();
//第二种情况,在fetch中加入参数,如下:
man1.fetch({url:'/getmans/'});
  //这样,就会发送get请求到/getmans/这个url中,
  //服务器返回的结果样式应该是对应的json格式数据,同save时POST过去的格式。

//不过接受服务器端返回的数据方法是这样的:
man1.fetch({url:'/getmans/',success:function(model,response){
    alert('success');
    //model为获取到的数据
    alert(model.get('name'));
  },error:function(){
    //当返回格式不正确或者是非json数据时,会执行此方法
    alert('error');
  }});

注:上述代码仅仅均为可正常执行的代码,不过关于服务器端的实例在后面会有。
这里还要补充一点,就是关于服务器的异步操作都是通过Backbone.sync这个方法来完成的,调用这个方法的时候会自动的传递一个参数过去,根据参数向服务器端发送对应的请求。比如你save,backbone会判断你的这个对象是不是新的,如果是新创建的则参数为create,如果是已存在的对象只是进行了改变,那么参数就为update,如果你调用fetch方法,那参数就是read,如果是destory,那么参数就是delete。也就是所谓的CRUD ("create", "read", "update", or "delete"),而这四种参数对应的请求类型为POST,GET,PUT,DELETE。你可以在服务器根据这个request类型,来做出相应的CRUD操作。

Note:
关于url和urlRoot的事,如果你设置了url,那么你的CRUD都会发送对应请求到这个url上,但是这样又一个问题,就是delete请求,发送了请求,但是却没有发送任何数据,那么你在服务器端就不知道应该删除哪个对象(记录),所以这里又一个urlRoot的概念,你设置了urlRoot之后,你发送PUT和DELETE请求的时候,其请求的url地址就是:/baseurl/[model.id],这样你就可以在服务器端通过对url后面值的提取更新或者删除对应的对象(记录)。

Collection
collection是model对象的一个有序的集合,概念理解起来十分简单,在通过几个例子来看一下,会觉得更简单。
1、关于book和bookshelf的例子

Book = Backbone.Model.extend({

defaults : {  // 感谢网友蓝色动力指正改为defaults

title:'default'

},

initialize: function(){

//alert('Hey, you create me!');

}

});

BookShelf = Backbone.Collection.extend({

model : Book

});

var book1 = new Book({title : 'book1'});

var book2 = new Book({title : 'book2'});

var book3 = new Book({title : 'book3'});

//var bookShelf = new BookShelf([book1, book2, book3]); //注意这里面是数组,或者使用add

var bookShelf = new BookShelf;

bookShelf.add(book1);

bookShelf.add(book2);

bookShelf.add(book3);

bookShelf.remove(book3);



//基于underscore这个js库,还可以使用each的方法获取collection中的数据

bookShelf.each(function(book){

alert(book.get('title'));

});

很简单,不解释
2、使用fetch从服务器端获取数据
首先要在上面的的Bookshelf中定义url,注意collection中并没有urlRoot这个属性。或者你直接在fetch方法中定义url的值,如下:

bookShelf.fetch({url:'/getbooks/',success:function(collection,response){

collection.each(function(book){

alert(book.get('title'));

});

},error:function(){

alert('error');

}});

其中也定义了两个接受返回值的方法,具体含义我想很容易理解,返回正确格式的数据,就会调用success方法,错误格式的数据就会调用error方法,当然error方法也看添加和success方法一样的形参。
对应的BookShelf的返回格式如下:[{'title':'book1'},{'title':'book2'}.....]
3、reset方法
这个方法的时候是要和上面的fetch进行配合的,collection在fetch到数据之后,会调用reset方法,所以你需要在collection中定义reset方法或者是绑定reset方法。这里使用绑定演示:

bookShelf.bind('reset',showAllBooks);

showAllBooks = function(){

bookShelf.each(function(book){

  ​//将book数据渲染到页面。

});

}

绑定的步骤要在fetch之前进行。
下面给出关于collection的完整代码,需要服务器端支持才行,服务器端的搭建在后面会写到。

<!DOCTYPE html>
<html>
<head>
  <title>the5fire-backbone-collection</title>
</head>
<body>
</body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/underscore.js/1.1.4/underscore-min.js"></script>
<script src="http://ajax.cdnjs.com/ajax/libs/backbone.js/0.3.3/backbone-min.js"></script>
<script>
(function ($) {
  //collection是一个简单的models的有序集合
  //1、一个简单的例子

  Book = Backbone.Model.extend({
    defaults : {  // 感谢网友蓝色动力指正改为defaults
      title:'default'
    },
    initialize: function(){
      //alert('Hey, you create me!');
    }
  });
  BookShelf = Backbone.Collection.extend({
    model : Book
  });

  var book1 = new Book({title : 'book1'});
  var book2 = new Book({title : 'book2'});
  var book3 = new Book({title : 'book3'});

  //var bookShelf = new BookShelf([book1, book2, book3]); //注意这里面是数组,或者使用add
  var bookShelf = new BookShelf;
  bookShelf.add(book1);
  bookShelf.add(book2);
  bookShelf.add(book3);
  bookShelf.remove(book3);
  /*
  for(var i=0; i<bookShelf.models.length; i++) {
    alert(bookShelf.models[i].get('title'));
  }
  */
  //基于underscore这个js库,还可以使用each的方法获取collection中的数据
  bookShelf.each(function(book){
    alert(book.get('title'));
  });

  //2、使用fetch从服务器端获取数据,使用reset渲染
  bookShelf.bind('reset', showAllBooks);
  bookShelf.fetch({url:'/getbooks/',success:function(collection,response){
    collection.each(function(book){
      alert(book.get('title'));
    });
  },error:function(){
    alert('error');
  }});
  showAllBooks = function(){
    bookShelf.each(function(book){
      ​//将book数据渲染到页面。
    });
  }
  //上述代码仅仅均为可正常执行的代码,不过关于服务器端的实例在后面会有。
})(jQuery);
</script>
</html>
Javascript 相关文章推荐
iframe 父窗口和子窗口相互的调用方法集锦
Dec 15 Javascript
JS定时器实例详细分析
Oct 11 Javascript
FireBug 调试JS入门教程 如何调试JS
Dec 23 Javascript
js打造数组转json函数
Jan 14 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
AngularJS实现根据变量改变动态加载模板的方法
Nov 04 Javascript
JavaScript构建自己的对象示例
Nov 29 Javascript
Angularjs上传图片实例详解
Aug 06 Javascript
Vue项目使用CDN优化首屏加载问题
Apr 01 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
Vue 实现手动刷新组件的方法
Feb 19 Javascript
解决layUI的页面显示不全的问题
Sep 20 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
May 07 #Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
May 07 #Javascript
JavaScript的Backbone.js框架入门学习指引
May 07 #Javascript
JavaScript数组方法总结分析
May 06 #Javascript
JS平滑无缝滚动效果的实现代码
May 06 #Javascript
使用AJAX实现Web页面进度条的实例分享
May 06 #Javascript
JavaScript中的原型继承基础学习教程
May 06 #Javascript
You might like
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
js有序数组的连接问题
2013/10/01 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python二分法搜索算法实例分析
2015/05/11 Python
python友情链接检查方法
2015/07/08 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
行政文秘岗位职责范本
2014/02/10 职场文书
创先争优活动方案
2014/02/12 职场文书
志愿者宣传口号
2014/06/17 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
自我检讨报告
2015/01/28 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫
Win2008系统搭建DHCP服务器
2022/06/25 Servers