码迷,mamicode.com
首页 > 其他好文 > 详细

backbone模型层浅析

时间:2015-01-08 19:42:45      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:

Model层有两个类: Model, Collection

1.Model

不翻文档,我们用代码说话。

首先分析下类。

var myM = Backbone.Model.extend({})//构造一个Model类,myM

这个类居然是空的,没有官方所说的那么多属性啊,难道underscore失灵了?

>_.keys(myM)
["extend", "__super__"]
>_.keys(Backbone.Model)
["extend"]

默认情况下,子类比父类多了一个__super__的东东,这到底是啥?

>_.isObject(myM.__super__)
true

对象。 在观察下:

>_.keys(myM.__super__)
["on", "once", "off", "trigger", "stopListening", "listenTo", "listenToOnce", "bind", "unbind", "changed", "validationError", "idAttribute", "initialize", "toJSON", "sync", "get", "escape", "has", "set", "unset", "clear", "hasChanged", "changedAttributes", "previous", "previousAttributes", "fetch", "save", "destroy", "url", "parse", "clone", "isNew", "isValid", "_validate", "keys", "values", "pairs", "invert", "pick", "omit"]

结论:父类的指针? 官方文档中列举的接口(函数/事件/属性)出现了,如上。

比较关系数据的同步,看看fetch的实现:

>myM.__super__.fetch
    function (t){
    t=t?i.clone(t):{};
    if(t.parse===void 0)t.parse=true;  
    var e=this;
    var r=t.success;
    t.success=function(i){
        if(!e.set(e.parse(i,t),t))return false;
        if(r)r(e,i,t);
        e.trigger("sync",e,i,t)
    };

    q(this,t);
    return this.sync("read",this,t)
}

 搞不懂q是什么,可以看出,myM.fetch({success:function(e,i,t){}); 即成功的回调函数接受三个参数,分别是啥未知。

   其次是fetch会调用本身的sync函数。

>myM.__super__.sync
function (){return e.sync.apply(this,arguments)} 

  云里雾里。过。

---------------分割线-------------------------

分析类的实例。

构造一个myM类的实例并分析:

>m_obj= new myM;
s {cid: "c6", attributes: Object, _changing: false, _previousAttributes: Object, changed: Object…}
>_.isObject(m_obj)
true
>_.keys(m_obj)
["cid", "attributes", "_changing", "_previousAttributes", "changed", "_pending"]

首先可以看出,实例的属性,跟类的属性很不相同,且跟父类的属性似乎一点关系都没有(没有继承?)。

真的是这样么?

>_.functions(m_obj)
["_validate", "bind", "changedAttributes", "clear", "clone", "constructor", "destroy", "escape", "fetch", "get", "has", "hasChanged", "initialize", "invert", "isNew", "isValid", "keys", "listenTo", "listenToOnce", "off", "omit", "on", "once", "pairs", "parse", "pick", "previous", "previousAttributes", "save", "set", "stopListening", "sync", "toJSON", "trigger", "unbind", "unset", "url", "values"]

 好吧,这个跟myM.__super__有一定的交集。交集为:

>m_obj_funcs = _.functions(m_obj)
base_funcs = _.functions(myM.__super__)
_.filter(base_funcs, function(f){return _.contains(m_obj_funcs,f)})

["_validate", "bind", "changedAttributes", "clear", "clone", "destroy", "escape", "fetch", "get", "has", "hasChanged", "initialize", "invert", "isNew", "isValid", "keys", "listenTo", "listenToOnce", "off", "omit", "on", "once", "pairs", "parse", "pick", "previous", "previousAttributes", "save", "set", "stopListening", "sync", "toJSON", "trigger", "unbind", "unset", "url", "values"]

 m_obj又有多出来哪些函数呢?

>_.filter(m_obj_funcs, function(f){return !_.contains(base_funcs,f);})
["constructor"]

  似乎是构造器

>m_obj.constructor
function (){return r.apply(this,arguments)} 

 

属性

["cid", "attributes", "_changing", "_previousAttributes", "changed", "_pending"]

(提示:回到之前构造m_obj的部分看看。)

先剧透下,attributes是属性键值对集合(JSON对象),比如,

>m_obj.set({‘name‘:‘tommy‘,‘blog‘:‘http://www.cnblogs.com/Tommy-Yu‘})
>m_obj.attributes
Object {name: "tommy", blog: "http://www.cnblogs.com/Tommy-Yu"}

其次,changed也是一个JSON对象,记录该实例哪些属性被改变了---只记录修改的部分。如下:

>m_obj.set({‘name‘:‘joe‘})
>m_obj.changed
Object {name: "joe"}

_previousAttributes,记录变更前的对象

>m_obj._previousAttributes
Object {name: "tommy", blog: "http://www.cnblogs.com/Tommy-Yu"}

至于cid这东东,一个临时的id吧。自动给某个类(比如myM)的对象按照数字顺序编号。

最后就是changing。

函数

["_validate", "bind", "changedAttributes", "clear", "clone", "destroy", "escape", "fetch", "get", "has", "hasChanged", "initialize", "invert", "isNew", "isValid", "keys", "listenTo", "listenToOnce", "off", "omit", "on", "once", "pairs", "parse", "pick", "previous", "previousAttributes", "save", "set", "stopListening", "sync", "toJSON", "trigger", "unbind", "unset", "url", "values"]

鉴于篇幅有限,介绍重点的:

--------------小分割------------

set() ---上面已经演示过了,设置对象的attributes属性。

has(attr) -- 判断对象的attributes是否具有attr属性

>m_obj.has(‘name‘)
true
>m_obj.has(‘age‘)
false

get(attr) -- 获取对象的attributes属性中的某一个key的值:

>m_obj.get(‘name‘)
"tommy"

-------------小分割-------------

 

previousAttributes() ---  _previousAttributes属性的get封装

>m_obj.previousAttributes()
Object {name: "tommy", blog: "http://www.cnblogs.com/Tommy-Yu"}

previous(key) -- 等同于 _previousAttributes[key] 

>m_obj.previous(‘name‘)
"tommy"

-------------小分割-------------

toJSON() -- 转化为json对象

>m_obj.toJSON()
Object {name: "tommy", blog: "http://www.cnblogs.com/Tommy-Yu"}

keys() --  将键转化为数组

>m_obj.keys()
["name", "blog"]

values() -- 将值转化为数组

m_obj.values()
["tommy", "http://www.cnblogs.com/Tommy-Yu"]

-------------小分割-------------

isNew() -- 是否客户端新建对象(与服务器同步时用到)

>m_obj.isNew()
true

isValide()-- 对象是否通过了验证

-------------小分割-------------

CRUD操作: fetch/save/destroy

前提:配置url(string/funciton  --> ajax路径)

 

backbone模型层浅析

标签:

原文地址:http://www.cnblogs.com/Tommy-Yu/p/4211552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!