在传统MVC框架模式中,Model承担业务逻辑的任务。Backbone作为一个mvc框架,主要的业务逻辑交由Model与Collection来实现。Model代表领域对象,今天主要学一下Model源码中几个重要的函数。
我们先看一下Model的构造函数做了哪些事情:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Create a new model with the specified attributes. A client id (`cid`) // is automatically generated and assigned for you. var Model = Backbone.Model = function(attributes, options) { //对参数的处理 var attrs = attributes || {}; options || (options = {}); this.cid = _.uniqueId(this.cidPrefix);//利用underscore生成一个客户端的唯一标识符cid this.attributes = {};//this.attributes是backbone中存放所有数据属性的对象 //collection在获取model对应的后端url时使用,在model上设置collection并不会自动将model加入collection if (options.collection) this.collection = options.collection; //调用parse方法解析数据 if (options.parse) attrs = this.parse(attrs, options) || {}; //处理defaults默认数据,用attrs覆盖defaults var defaults = _.result(this, 'defaults'); attrs = _.defaults(_.extend({}, defaults, attrs), defaults); this.set(attrs, options);//接收attrs将数据处理后放入this.attributes this.changed = {};//changed属性用来保存修改过的属性数据,第一次set,不需要changed数据 this.initialize.apply(this, arguments);//调用initialize初始化model,这个方法需要子类来覆盖 }; |
Model的构造函数主要做了以下几件事:
- 处理参数
- 处理model的属性:cid、attributes、collection
- 解析数据、处理属性的默认值
- set方法接收处理参数
- 调用initialize做初始化操作
接下来是一个重要的set函数,这个函数是Model最核心的一个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
// Set a hash of model attributes on the object, firing `"change"`. This is // the core primitive operation of a model, updating the data and notifying // anyone who needs to know about the change in state. The heart of the beast. set: function(key, val, options) { if (key == null) return this; // Handle both `"key", value` and `{key: value}` -style arguments. var attrs; if (typeof key === 'object') {//{key: value}形式 attrs = key; options = val; } else {// key, value, options形式 (attrs = {})[key] = val; } options || (options = {});//设置options参数 // Run validation. //首先验证参数,这里没有直接调用validate方法,而是调用_validate这个私有方法,该方法内部调用validate方法 if (!thisʌ证参数,这里没有直接调用validate方法,而是调用_validate这个私有方法,该方法内部调用validate方法 if (!this -->
Model的构造函数主要做了以下几件事:
接下来是一个重要的set函数,这个函数是Model最核心的一个方法
|