如何在集合中创建动态url并使用 Backbone 网建模

snz8szmq  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(221)

我的收藏和模型是这样的:

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的赋值不成功,我不知道为什么。
希望你的帮助。谢谢。

vi4fp9gy

vi4fp9gy1#

我认为您在运行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

l7wslrjt

l7wslrjt2#

我会用几句话来满足这个公认的答案。
1.初始化Backbone.Collection时的第一个参数是模型数组,然后是选项。要创建包含选项的空集合,您应该执行以下操作
var c = new Backbone.Collection(**null**,**{opt1: val1, opt2: val2}**);
1.实际上,你不能在url函数中访问this.options,因为没有像在模型中那样的选项。你能做的是,在初始化时从选项中分配所需的属性。

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;
}
zte4gxcn

zte4gxcn3#

我想从一个模型中使用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()
    }
});

相关问题