我有一个Backbone Collection
类,其url
属性设置为方法。
url
由3个“元素”组成,我称之为baseUrl
,username
和path
- 所以它看起来像baseUrl/username/path
< / p>
我在我正在处理的水疗中心为几个用户使用相同的实例。但是,我希望能够更改的一个元素(在实例化之后)是用户名。我需要这个有两个原因。
1st - 我在实例化时没有username属性。
第二 - 用户名因用户而异,我不想为每个新用户创建新的集合实例。
所以我的问题是为什么url
方法在实例化集合后不接受参数,以便我可以执行myCollection.url({username: "Mac"})
之类的操作?
为什么Backbone
不允许将参数传递到url
方法?
答案 0 :(得分:1)
Backbone使用集合作为上下文调用url
方法,因此您可以使用this
访问集合实例的成员变量。
var MyCollection = Backbone.Collection.extend({
url: function() {
return "base-url/" + this.username + "/path";
},
});
要在实例化后使用此功能,您可以手动设置集合的username
字段,也可以覆盖集合的sync
方法。
var MyCollection = Backbone.Collection.extend({
url: function() {
return "base-url/" + this.username + "/path";
},
sync: function(method, model, options) {
options = options || {};
if (options.username) this.username = options.username;
// call the default sync
return Backbone.collection.prototype.sync.call(this, method, model, options);
}
});
并使用它:
myCollection.fetch({ username: "Mac" });
有关如何知道如何调用网址的其他信息
我是Backbone的annotated source的狂热用户,这非常重要,因为很多Backbone的功能都没有记录,而且来源很小且很容易通过。
如果您检查sync
方法,则会看到该行:
params.url = _.result(model, 'url') || urlError();
如果你检查下划线的result
函数,你可以看到它调用函数(作为字符串传递),如下所示:
return _.isFunction(value) ? value.call(object) : value;