0

フロントエンドで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);
        }
    });
},
4

1 に答える 1

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);
        }
    });
},
于 2012-10-24T10:41:42.330 に答える