我的收藏和模型如下:
detail_userid = 0;
detail_contactid = 0;
var ContactDetail = Backbone.Model.extend({
urlRoot: URL_CONTACTS1+detail_userid+"/"+detail_contactid
});
var ContactDetailCollection = Backbone.Collection.extend({
model: ContactDetail,
url: URL_CONTACTS1+detail_userid+"/"+detail_contactid
})
入口是:
ContactDetailManagePageModel.prototype.init = function(m,n){
detail_userid = m;
detail_contactid = n;
var myContactDetails = new ContactDetailCollection();
var contactDetailListView = new ContactDetailListView({
collection: myContactDetails
});
myContactDetails.fetch({reset:true});
}
但是当它运行时,网址为:http://localhost:8080/ws/users/contacts/0/0
,这意味着对detail_userid和detail_contactid的分配不成功,我不知道为什么。
希望得到你的帮助。谢谢。
答案 0 :(得分:13)
我认为你在运行PageModel的init之前静态地定义了urlRoot和url属性(不太确定你从哪里得到m和n ......)
url和urlRoot都可以是一个函数,因此您可以在实例化期间传入选项并在模型上动态设置它们。
简单的例子包括定义集合然后创建一个
var ContactDetailCollection = Backbone.Collection.extend({
model: ContactDetail,
url: function(){
return URL_CONTACTS1 + this.options.detail_userid + "/" + this.options.detail_contactid;
}
});
var myContactDetails = new ContactDetailCollection({
detail_userid: foo,
detail_contactid: bar
});
正如我所提到的,我不确定你的init函数是做什么的,我猜这是你的应用程序定制的东西,我不需要担心。
我很确定要带走的主要是动态设置url和urlRoot
答案 1 :(得分:7)
我会用几句话来完成接受的答案。
初始化Backbone.Collection
时的第一个参数是模型数组,然后是选项。要使用您应该执行的选项创建一个空集合
var c = new Backbone.Collection(null, {opt1: val1, opt2: val2});
实际上,您无法访问this.options
函数中的url
。模型中没有选项。您可以做的是在初始化时从选项中分配所需的属性。
initialize: function (models, options) {
// `parseInt()` is used for consistency that `id` is numeric, just to be sure
this.detail_userid = parseInt(options.detail_userid);
this.detail_contactid = parseInt(options.detail_contactid);
}
稍后您可以像这样访问它们:
url: function() {
return URL_CONTACTS1 + this.detail_userid + "/" + this.detail_contactid;
}
答案 2 :(得分:0)
我想使用一个模型的HATEOAS href来获取另一个模型的数据。它只是在新创建的集合上设置url,而不是在构造函数中立即定义它。
var DailyMeasuresCollection = Backbone.Collection.extend({
//url : set dynamically with collection.url = url
model : DailyMeasuresModel,
parse : function(data) {
return data._embedded.dailyMeasures;
}
});
var DailyMeasuresTopicListItemView = Backbone.View.extend({
//...
events : {
'click .select-topic' : 'onClick'
},
onClick : function() {
var topicMeasures = new DailyMeasuresCollection()
topicMeasures.url = this.model.attributes._links.measures.href // <- here assign
var topicMeasuresView = new DailyMeasuresListView({
collection : topicMeasures
});
topicMeasures.fetch()
}
});