我对Backbone中url属性的理解

Model中有一个url属性,而且有一个urlRoot属性。

Collection中也有一个url属性。

  // 这是Model中的url方法
  url: function() {
     var base =
       _.result(this, 'urlRoot') ||
       _.result(this.collection, 'url') ||
       urlError();
     if (this.isNew()) return base;
     return base.replace(/([^\/])$/, '$1/') + encodeURIComponent(this.id);
   }

从以上代码可以看出以下几点:

  1. url默认是一个函数,它的返回值是字符串。
  2. 它使用urlRoot和id来拼接真实url。
  3. 如果urlRoot属性不存在,则使用该Model所属的Collection的url属性替代。所以表现出Model可以继承了Collection中的url属性。
  4. 上面说的都是使用默认url的情况下,如果我们重写了url属性,比如直接写一个字符串代表真实url。那么就不会和id进行拼接了,当然也不会继承Collection中的url了。
  5. 需要重点关注一下_.result()方法,这个方法可以得到对象的某个属性值,如果该属性值是一个函数,那么就执行该函数,然后再返回。
  6. 所以呢,url,urlRoot都是可以重写为函数的。

下面我修改了Backbone.sync方法,主要目的是使用我自己的url,这也是因为后端的API不支持REST接口。

  // 这是Backbone.sync方法中的获得url的代码片段
  if (!options.url) {
     params.url = _.result(model, 'url') || urlError();
   }

  // 现在修改为:其实就是给Model增加了一个urls属性,该属性是一个对象,保存了相应的url,只不过其中的key是相应的method.
  if (!options.url) {
     params.url = (model.urls && model.urls[method]) || _.result(model, 'url') || urlError();
   }

  // 这是urls属性的例子
  urls: {
   "create": "json/lxr/create",
   "update": "json/lxr/update",
   "delete": "json/lxr/delete",
   "read": "json/lxr/read/"
     }

你可能感兴趣的:(backbone)