数据模型
model可以对应到数据库中的某条数据
创建数据模型
// 定义某类的默认模型值
var Book = Backbon.Model.extend({
defaults: {
name: 'unknown',
author: 'unknown',
price: 0
}
});
// 设置实例的模型值
var book = new Book({
name: 'yf',
author: 'noting',
price: 11
});
- 从Backbone模块继承的子类都有静态属性
__super__
,静态属性和静态方法就是不用创建实例就可以使用的方法
初始化和读取数据
- 通过
new
初始化数据 - 通过以下方法读取数据
modelInstance.get()
-
modelInstance.escape()
防XXS攻击 -
modelInstance.previous()
获取模型改变之前的数据,××但是××只能在change事件和属性事件中使用
- 所有的数据存储在
modelInstance.attributes
中,但是不建议用它获取数据和改变数据
-
model.previousAttributes()
使用场景和previous
相同
修改数据
modelInstance.set()
- 当修改数据时,会出发change事件。通过
modelInstance
对事件的监听,作出响应 -
change
事件的两个参数,model
模型本身,当是属性事件的时候有第二个参数value
// 一般这种会通过 listenTO 放到 view 中,因为监听model 上事件,一般是 view 作出改变
// 是否触发change事件和属性事件,是看值是否发生了改变。如果没有,即使set,也不触发
modelInstance.on('change',function () {});
// 属性事件
modelInstance.on('change:name',function () {});
数据验证
数据验证这一项是个函数,该函数会在模型数据发生改变之前进行进检验。有返回值,无论什么,
return false
都是没有通过验证。不返回值的时候,通过验证
- 数据验证对应有
error
方法,modelInstance.on('error',function(){})
-
modelInstance.set
可以添加对象,设置该对象的silent
选项,本次不会进行validate
检验,但是下次set
并且没有silent
时,还是会触发。同时,当本次设置出错时,不会报错,不会出发change
事件 -
modelInstance.set
可以添加对象,设置该对象的error
选项。优先于error
事件 -
error
事件,有两个参数model
和error
。第一个模型对象,第二个是validate
中返回的数据。
// 简单类型
var Book = Backbone.Model.extend({
validate: function (attrs) {
// attrs 是实例上的attributes
}
});
删除数据
会触发change事件,当删除模型中某个数据项时,再获取为
undefined
modelInstance.unset(name)
modelInstance.clear()
将模型数据同步到服务器
- 数据标识。模型向服务器发送请求,比如修改或者删除,但是需要带上model的id。这个是model发送请求的时候,自动添加的。
- url规则。
urlRoot
方式,发送请求是请求地址加上数据标识。url
方式,发送请求没有数据表示。两者的区别
-
urlRoot
方式,服务器接口根目录,但是我们无权访问,需要使用id组成最终地址。优先级第三。 -
url
方式,服务器接口地址是已知的,这个地址对应的操作无需模型的id。优先级第二。 -
modelInstance.set
第三个参数对象可以添加url
选项。优先级第一
- 数据和服务器数据进行同步。
-
modelInstance.save()
,这个方法向服务器发送请求,同时将响应数据设置给模型。但是,设置给model
的时候,会先经过parse
- 该方法,可以设置第一个参数,数据对象
- 第二个参数,
wait
选项,后台无响应或响应出错,model不会改变 - 第二个参数,
url
选项 - 第二个参数,
success
选项,error
选项 - 当使用
save
时,内部自动调用isNew
。此时,如果没有id
,将被认为是新的数据,使用post
方式发送。如果服务器不返回带有id
的响应数据,那么再次使用save
时,依旧会使用post
方式发送 - 使用
save
的时候会触发三个事件,change
,request
,sync/error
。change
发生的事件不定。因为set
发生在什么时候是可以配置的,如果有validate
还可能会触发errro
事件。 - 使用
save
方法后,可以设置回调,但是回调中一般不要有对模型的改变,可以在change
事件中改变 - 使用
parse
方法对返回数据进行处理,然会return
,这样模型上数据能够结构正确
-
modelInstance.fetch()
- 参数和
save
的第二个参数相同 - 会触发的事件有
change
,request
,sync/error
- 客户端新创建的模型没有id,依旧可以使用
fetch
拉取数据
- 参数和
-
modelInstance.destroy()
- 第一个参数,
wait
选项,后台无响应或响应出错,model不会改变 - 会触发
destory
,request
,sync
事件。
- 第一个参数,
应用
- 在
Table
或者Form
的baseCollection
中,设置parse
函数。(可以把Collection想想成Models) - 在具体的
Collection
中设置地址 - 在事件中,父视图监听子视图的模型,一旦发生
sync
,就从新请求一次数据。
// 视图监听其他视图的模型上数据改变
this.listenTo(childModel.model,'change',function(){});
// 视图监听自己模型上数据变化
this.listenTo(this.model,'change',function(){});