首先,我们看一下官方文档中对Model的解释(或者说定义):

Models are the heart of any JavaScript application, containing the interactive data as well as a large part of the logic surrounding it: conversions, validations, computed properties, and access control. You extend Backbone.Model with your domain-specific methods, and Model provides a basic set of functionality for managing changes.

翻译成中文就是:

Model是js应用的核心,包括交互数据以及围绕着这些数据的大部分逻辑:数据转换、验证、属性计算和访问控制。你可以使用特定方法来扩展Backbone.Model,并且Model本身就提供了一系列基本的管理功能。

然后,我们还在文档中看到Model拥有好多方法,这里就不一一介绍了。

简单的Model例子

定义了一个最基础的Model,只是实现了initialize这个初始化方法。这个函数会在Model被实例化时调用。

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

初始化函数,也可以叫构造函数。比如你这里完全可以把constructor写成initialize,效果是一样的。至于为什么一样?这还得等到熟悉这个框架过后看看Backbone源码才能知道。

Molde对象属性赋值的两种方法

一种是设置默认值

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

或者这样赋值

    man.set({name:'the5fire',age:'10'});
console.info(man.get("name"));
console.info(man);

从这个对象的取值方式可以知道,属性在一个Model是以字典(或者类似字典)的方式存在的,第一种设定默认值的方式,只不过是实现了Backbone的defaults这个方法,或者是给defaults进行了赋值。通过打印出man这个对象,我们可以发现,属性是存在一个叫做attributes的对象中的。

Model对象中的方法

var 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());

也是比较简单,只是增加了一个新的属性,值是一个function。说到这,不知道你是否发现,在所有的定义或者赋值操作中,都是通过字典的方式来完成的,比如extend Backbone的Model,以及定义方法,定义默认值。方法的调用和其他的语言一样,直接 "." 即可,参数的定义和传递也一样。

监听Model对象中属性的变化

假设你有在对象的某个属性发生变化时去处理一些业务的话,下面的示例会有帮助。依然是定义那个类,不同的是我们在构造函数中绑定了name属性的change事件。这样当name发生变化时,就会触发这个function。

var 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'
}
});
var man = new Man;
//触发绑定的change事件,alert。
man.set({name:'the5fire'}); //触发绑定的change事件,alert。
man.set({name:'the5fire.com'});

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

var Man = Backbone.Model.extend({
initialize: function(){
alert('Hey, you create me!');
//初始化时绑定监听, change事件会先于validate发生
this.bind("change:name",function(){
var name = this.get("name");
alert("你改变了name属性为:" + name);
});
this.bind("invalid",function(model,error){
alert(error);
});
},
defaults: {
name:'张三',
age: '38'
},
validate:function(attributes){
if(attributes.name == '') {
return "name不能为空!";
}
}
});
var man = new Man;
// 这种方式添加错误处理也行
// man.on('invalid', function(model, error){
// alert(error);
// }); //默认set时不进行验证
man.set({name:''});
//save时触发验证。根据验证规则,弹出错误提示。
man.save(); //手动触发验证, set时会触发
man.set({name:'moyi'}, {'validate':true});
//验证通过时信息
if (man.isValid()) {
alert(man.get("name")+"验证通过");
}

和服务器进行交互,Model对象的保存和获取

由于本人比较懒,这里就暂时不去折腾服务器了。交互数据这些东西就用jquery-mockjax模拟一下得了(PS:前面有写过一篇关于mockjax的文章)。

这里AJAX请求模拟

var isAjaxMocked = true;
if (isAjaxMocked) {
$.mockjax({
url: '/man/read',
status: 200,
type: "get",
responseTime: 100,
responseText: {'name': 'Moyi', 'age': '1111'}
});
$.mockjax({
url: '/man/update',
status: 200,
type: "post",
responseTime: 100,
responseText: {'name': 'qianlan', 'age': '11'}
});
}
        // 和服务器进行交互,对象的保存和获取
var Man = Backbone.Model.extend({
url:'/man/update',
initialize: function(){
console.log('Hey, you create me!');
//初始化时绑定监听
this.bind("change:name",function(){
var name = this.get("name");
console.log("你改变了name属性为:" + name);
});
this.bind("error",function(model,error){
console.log(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'});
//会发送POST到模型对应的url,数据格式为json{"name":"the5fire","age":38}
// man.save();
man.save({"name":"the5fire","age":38},{url:'/man/update',
success:function(model,response){
console.log('success');
//model为获取到的数据
console.log(model.get('name')+" and "+model.get('age'));
},error:function(){
//当返回格式不正确或者是非json数据时,会执行此方法
console.log('error');
}
});
//然后接着就是从服务器端获取数据使用方法fetch([options])
var man1 = new Man;
//第一种情况,如果直接使用fetch方法,
//那么他会发送get请求到你model的url中,
//你在服务器端可以通过判断是get还是post来进行对应的操作。
// man1.fetch();
//第二种情况,在fetch中加入参数,如下:
// man1.fetch({url:'/man/read'});
//这样,就会发送get请求到/getmans/这个url中,
//服务器返回的结果样式应该是对应的json格式数据,同save时POST过去的格式。 //不过接受服务器端返回的数据方法是这样的:
man1.fetch({url:'/man/read',
success:function(model,response){
console.log('success');
//model为获取到的数据
console.log(model.get('name')+" and "+model.get('age'));
},error:function(){
//当返回格式不正确或者是非json数据时,会执行此方法
console.log('error');
}
});

Model部分暂时就到这里,总的来说,Model就是对数据以及和数据有关的逻辑的一些处理。

Backbone.js学习之Model的更多相关文章

  1. 【转】Backbone.js学习笔记(二)细说MVC

    文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ...

  2. Backbone.js学习之二

    经历一段自我修炼,终于领悟到Backbone.js的关键知识点,也发现了原来MVC可以在前端这样梦幻的发挥,Backbone.js确实是一个很有魅力的前端MVC框架. 练就一门技术,需要有扎实的功底, ...

  3. Backbone.js学习之初识hello-world

    说了好久好久要学习Backbone.js,现在终于下定决心开始学习了.然后呢,就根据我的学习进度在这里做个简单的记录,方便新人,也方便我自己以后回忆. 准备 用bower下载这几个库或框架也是醉了.. ...

  4. Backbone.js 中使用 Model

    前面几篇 Backbone.js 的例子中有使用到 template, 及数据的填充,其实这已经很接近 Model 了.现在来学习怎么创建自己的 Model 类,并简单的使用.Backbone.js ...

  5. 【转】Backbone.js学习笔记(一)

    文章转自: http://segmentfault.com/a/1190000002386651 基本概念 前言 昨天开始学Backbone.js,写篇笔记记录一下吧,一直对MVC模式挺好奇的,也对j ...

  6. Backbone.js学习之Backbone.View(视图)

    Backbone.js为复杂WEB应用程序提供模型(models).集合(collections).视图(views)的结构.其中模型用于绑定键值数据和自定义事件:集合附有可枚举函数的丰富API: 视 ...

  7. Backbone.js学习之一

    昨天一个我崇拜的朋友,徐飞送我一本名为<Backbone.js实战>书,让我心中狂喜,于是带着这份浓厚的兴趣,开始研究Backbone.js之路. 打开这本书的第一句话就很有哲理,“授人以 ...

  8. backbone.js学习笔记

    之前只接触过jQuery,看来Backbone是除了jQuery的第二大JS框架... backbone到底是个啥? 其实刚开始我也不知道=_=,我是这周二才听说居然还有这么个框架...于是乎我的导师 ...

  9. Backbone.js学习之View

    千呼万唤始出来,终于到最后一个要点View了.照旧,先来一睹官方文档: Backbone views are almost more convention than they are code - t ...

随机推荐

  1. GIT 中提示 please tell me who you are

    如果使用git过程中出现了,please tell me who you are ,需要设置一下使用者的身份. 1.git config user.name "username" ...

  2. ClassRequestHandler or VendorRequestHandler wIndex must be less than NumIFs

    P1_ro:20000EEA ClassRequestHandler ; CODE XREF: USB__HandleSetup+38j P1_ro:20000EEA LDRB R0, [R4,#4] ...

  3. vs2010代码注释自动生成api文档

    最近做了一些接口,提供其他人调用,要写个api文档,可是我想代码注释已经写了说明,能不能直接把代码注释生成api?于是找到以下方法 环境:vs2010 先下载安装Sandcastle 和Sandcas ...

  4. c# ActiveX 控件的开发

    关于ActiveX控件的开发,网上很多例子,昨天也整整研究一天才捋顺了. 网上大部分例子都是js调用控件的方法,由于要实现在html页面"相应"控件的事件,整整折腾一天. 关键点在 ...

  5. MySQL 错误代码和消息

    本章列出了当你用任何主机语言调用MySQL时可能出现的错误.首先列出了服务器错误消息.其次列出了客户端程序消息. B.1. 服务器错误代码和消息 服务器错误信息来自下述源文件: ·         错 ...

  6. MiinCMP1.0 SAE 新浪云版公布, 开源企业站点系统

    MiinCMP是一款开源企业站点系统,除可执行于256M左右100元的国内IDC外,JUULUU聚龙软件团队最近开发了面向新浪云的版本号,该版本号可将站点免费布署到新浪云SAE上.MiinCMP採用j ...

  7. Codeforces Round #336 (Div. 2) D. Zuma 记忆化搜索

    D. Zuma 题目连接: http://www.codeforces.com/contest/608/problem/D Description Genos recently installed t ...

  8. hdu 1078 FatMouse and Cheese (dfs+记忆化搜索)

    pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/ ...

  9. Android Task 与 Back Stack

    Tasks and Back Stack 一个应用通常包括多个 activity.每个 activity应用设计为围绕针对执行用户特定的行为和可以启动其它 activity. 一个 Activity也 ...

  10. mfc extention dll 與 normal dll 的區別

    extention dll 1.指從MFC中繼承過來的DLL,一般要求使用共享MFC DLL進行連接,也要求調用者也使用MFC且使用共享MFC,如此可保證DLL與調用者有相同的MFC庫. 2.在使用資 ...