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);
}
从以上代码可以看出以下几点:
- url默认是一个函数,它的返回值是字符串。
- 它使用urlRoot和id来拼接真实url。
- 如果urlRoot属性不存在,则使用该Model所属的Collection的url属性替代。所以表现出Model可以继承了Collection中的url属性。
- 上面说的都是使用默认url的情况下,如果我们重写了url属性,比如直接写一个字符串代表真实url。那么就不会和id进行拼接了,当然也不会继承Collection中的url了。
- 需要重点关注一下_.result()方法,这个方法可以得到对象的某个属性值,如果该属性值是一个函数,那么就执行该函数,然后再返回。
- 所以呢,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/"
}