骨干集合url不带参数

时间:2016-09-09 16:26:22

标签: javascript backbone.js

我有一个Backbone Collection类,其url属性设置为方法。

url由3个“元素”组成,我称之为baseUrlusernamepath - 所以它看起来像baseUrl/username/path < / p>

我在我正在处理的水疗中心为几个用户使用相同的实例。但是,我希望能够更改的一个元素(在实例化之后)是用户名。我需要这个有两个原因。

1st - 我在实例化时没有username属性。

第二 - 用户名因用户而异,我不想为每个新用户创建新的集合实例。

所以我的问题是为什么url方法在实例化集合后不接受参数,以便我可以执行myCollection.url({username: "Mac"})之类的操作?

为什么Backbone不允许将参数传递到url方法?

1 个答案:

答案 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;
相关问题