如何使用骨干在集合和模型中创建动态URL

时间:2013-06-28 06:14:16

标签: url backbone.js

我的收藏和模型如下:

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的分配不成功,我不知道为什么。

希望得到你的帮助。谢谢。

3 个答案:

答案 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)

我会用几句话来完成接受的答案。

  1. 初始化Backbone.Collection时的第一个参数是模型数组,然后是选项。要使用您应该执行的选项创建一个空集合

    var c = new Backbone.Collection(null, {opt1: val1, opt2: val2});

  2. 实际上,您无法访问this.options函数中的url。模型中没有选项。您可以做的是在初始化时从选项中分配所需的属性。

  3. 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()
    }
});