フロントエンドでbackbone.jsとbackbone-relational.jsを使用し、バックエンドでPyramid / Cornice/SQLAlchmenyによって実行されるRESTfulAPIを使用してアプリケーションを構築しようとしています。
この段階では、クライアント(基本的にビジネス)とアセット(ビジネスが所有するアセット)の2つのモデルがあります。最終的には、ユーザーやサイトなどのために、他の多くのモデルがあります。 2つのモデル:
Client:
id
name
Asset:
id
make
model
purchase_cost
client_id
現在、これらのモデルからサーバーからデータをフェッチするときに、私のbackbone.jsコードは正常に機能しています。2つのリストビューがあります。1つはすべてのクライアントのリストを表示し、もう1つはすべてのアセットのリストを表示します。
私の問題は、クライアントのリストでクライアントの1つをクリックすると、その特定のクライアントに属するアセットのみのリストを表示したいということです。そのサーバー側の部分に問題はありません。これは単なるfilter()です。私の質問は、アセットのリストを要求するときに、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は、アセットのリストを取得するときに制約としてサーバーに送信します。実行する必要があることはすべてAssetCollectionモデルにあると思いますが、CollectionAPIには適切と思われるものが何も表示されません。すでにフェッチされたリストでフィルタリングを行うメソッドはありますが、アセットのサブセットのみが必要で、サーバーを代わりにフィルターします。
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);
}
});
},