2016-09-09 73 views
1

我有一个Backbone Collection类,url属性设置为一个方法。骨干网址不带参数

url是由我称之为baseUrlusernamepath 3“元素” - 所以它看起来像baseUrl/username/path

我用的是同一个实例为多个用户在我工作的水疗中心。然而,我希望能够改变(在实例化之后)的一个元素是用户名。我需要这个有两个原因。

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

第2个 - 用户名更改取决于用户,我不想为每个新用户创建集合的新实例。

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

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

回答

1

骨干调用url方法与集合作为​​上下文,因此您可以通过this访问您的集合实例的成员变量。

var MyCollection = Backbone.Collection.extend({ 
    url: function() { 
     return "base-url/" + this.username + "/path"; 
    }, 
}); 

要instanciation后使用此,您可以手动设置您的收藏的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" }); 

如何知道网址怎么叫

我骨干的annotated source的忠实用户,它是作为非常重要的附加信息很多Backbone的功能都没有文档记录,而且源代码很小且很容易通过。

如果检查sync方法,你应该看到一行:

params.url = _.result(model, 'url') || urlError(); 

如果你检查下划线的result功能,你可以看到,它调用这样的功能(作为字符串传递):

return _.isFunction(value) ? value.call(object) : value;