当前位置: 代码迷 >> Web前端 >> Backbone 学习札记
  详细解决方案

Backbone 学习札记

热度:574   发布时间:2012-11-23 00:03:43.0
Backbone 学习笔记

1. 在 backbone 的 set 方法的源码中,有如下一段代码:

      // Handle both `"key", value` and `{key: value}` -style arguments.
      if (_.isObject(key) || key == null) {
        attrs = key;
        options = value;
      } else {
        attrs = {};
        attrs[key] = value;
      }

这段代码应该是分别处理以下两种情况的:

note.set({title: "March 20", content: "In his eyes she eclipses..."}, {silent:true});

?此时,

attrs =?{title: "March 20", content: "In his eyes she eclipses..."};

options =?{silent:true}

book.set("title", "A Scandal in Bohemia");

?此时,

attrs["title"] =?"A Scandal in Bohemia";

options : 从代码中出以看出,此参数没有被初始化

?

当然,若改为下面这样的代码之后:

book.set("title", "A Scandal in Bohemia", {silent : true});

此时,

attrs["title"] =?"A Scandal in Bohemia";

options :{silent : true}

?

2. 在set和save方法中, ?均有如下一段代码:

 // Run validation.
 if (!this._validate(attrs, options)) return false;

?也就是说,在真正执行set或者save方法之前,会执行上述代码(官方文档里也是这么说的)。

_validate 方法的源码原下:

_validate: function(attrs, options) {
      if (options.silent || !this.validate) return true;
      attrs = _.extend({}, this.attributes, attrs);
      var error = this.validate(attrs, options);
      if (!error) return true;
      if (options && options.error) {
        options.error(this, error, options);
      } else {
        this.trigger('error', this, error, options);
      }
      return false;
    }

从源码中我觉得有两个地方是需要注意的:

① 当我们在set 或者 save 时,如果在 options 中传入了 {silent : true} 这个参数,那么,系统是不会调用 我们自己在Model中定义的validate方法的,因为在 ?_validate中第一行,就直接返回 true 了。

② 在Model中,我们自定义的 validate 方法中,如果校验失败,我们也不能直接返回 false ,而是返回一个字符串或者其他的对象,否则的话,从上面第四行,我们可以看到,该方法将返回true,这与我们想要的是相反的。

?

3.根据 2 中_validate方法的源码的第6行的 ? ?options.error(this, error, options); ? ? 来看,在校验失败之后,系统会调用一个 error 对应的 callback 方法,那么,这个callback 是怎么传进来的呢?答案就是,在 调用 set 方法时,将该 callback 作为一个 options 传进行来,可以参考下面的代码:

$("input[value='name']").click(function() {
		var name = $("#name").val();
		mt.set(
				{name : name}, 
				{error: function(context,msg,options) {alert(msg);}
		});
	});

?将上面的代码对照着官方的 set 方法的说明来看,

model.set(attributes, [options])

应该会比较容易理解:

?{name : name} ?是作为 attributes 的,

{error: function(context,msg,options) {alert(msg);} ?是作为 options 的

?