2012-10-24 48 views
0

我試圖建立一個應用程序使用backbone.js和backbone-relational.js在前端,與由金字塔/檐口/ SQLAlchmeny運行RESTful api on後端。backbone.js:如何發送約束時做一個列表GET

在這個階段,我有兩個模型,客戶(基本上是企業)和資產(企業擁有的資產)......並且最終還會有一些其他模型,用於用戶,網站等。兩個模型的簡化的例子:

Client: 
    id 
    name 

Asset: 
    id 
    make 
    model 
    purchase_cost 
    client_id 

現在,獲取從服務器這些模型中的數據時,我Backbone.js的代碼,目前工作正常;我有兩個列表視圖,一個顯示所有客戶端的列表,另一個顯示所有資產的列表。

我現在的問題是,當我點擊客戶端列表中的某個客戶端時,我希望它只顯示屬於該特定客戶端的資產列表。服務器端部分沒有問題,它只是一個過濾器(),我的問題是,當請求資產列表時,如何讓backbone.js發送這樣的約束?

(雖然我在下面的代碼中使用RelationalModel,我還在學習它並沒有真正制定出如何利用它尚未)

window.Asset = Backbone.RelationalModel.extend({ 
    urlRoot:"/api/assets", 
    defaults:{ 
     "id":null, 
     "make":null, 
     "model":null, 
     "purchase_cost":null, 
    }, 
    relations: [{ 
     type: Backbone.HasOne, 
     type: Backbone.HasOne, 
     key: 'client_id', 
     relatedModel: Client 
    }] 
}); 

window.AssetCollection = Backbone.Collection.extend({ 
    model: Asset, 
    url: "/api/assets" 
}); 

window.Client = Backbone.RelationalModel.extend({ 
    urlRoot:"/api/clients", 
    defaults:{ 
     "id":null, 
     "name":null 
    } 
}); 

window.ClientCollection = Backbone.Collection.extend({ 
    model: Client, 
    url: "/api/clients" 
}); 

我不認爲我需要在這裏顯示任何視圖。在我的路由器中,我目前有一個listClients函數和一個listAssets(見下文)函數,我想我需要添加一個listAssetsforClient(clientid)函數,但我不確定我的意思處理clientid,這樣backbone.js會在獲取Assets列表時將它作爲約束髮送給服務器。我認爲無論需要做什麼都會在AssetCollection模型中進行,但我看不到Collection API中看起來合適的任何東西。有一些方法可以在已經獲取的列表上進行過濾,但是當我只需要其中的一部分資源時,獲取資源的整個列表(並且最終可能會有成千上萬)似乎效率低下,並且可以使服務器改爲過濾。

listAssets: function() { 
    $('#header').html(new AssetHeaderView().render().el); 
    this.assetList = new AssetCollection(); 
    var self = this; 
    this.assetList.fetch({ 
     success:function() { 
      self.assetListView = new AssetListView({model:self.assetList}); 
      $('#sidebar').html(self.assetListView.render().el); 
      if (self.requestedId) self.assetDetails(self.requestedId); 
     } 
    }); 
}, 
+0

我認爲,而不是$('#header')。html(新的AssetHeaderView()。render()。el);你應該使用$('#header')。append(new AssetHeaderView()。render()。$ el);但也許我錯了。 – Naor

回答

0

好吧,我已經想通了。 fetch()方法有一個可選的'data'參數可以傳遞約束。所以,我的新功能將是:

listAssetsforClient: function(id) { 
    $('#header').html(new AssetHeaderView().render().el); 
    this.assetList = new AssetCollection(); 
    var self = this; 
    this.assetList.fetch({ 
     data: { clientid: id }, 
     success:function() { 
      self.assetListView = new AssetListView({model:self.assetList}); 
      $('#sidebar').html(self.assetListView.render().el); 
      if (self.requestedId) self.assetDetails(self.requestedId); 
     } 
    }); 
}, 
+0

當然,這隻適用於獲取數據,現在我必須弄清楚在保存新資產對象時如何獲取客戶... – paul88888