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 的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值