2

ember-dataのソースコードを検索して読んでいますが、これを行う方法を理解するのに苦労しています。したがって、私のインデックスページは次のようにデータをロードします。

App.SaleRecordsRoute = Ember.Route.extend({
  setupController: function(controller) {
    controller.set('content', App.SaleRecord.find());
  }
});

サーバーでは、最新の10レコードで応答するだけです。私もやりたいのは、同じURLをクエリして、単一の検索フィールドを渡すことです。この検索フィールドまたは条件は、データベース内のいくつかのフィールドに対してチェックされます。これらのフィールドは、joinステートメントのいくつかの異なるモデルにまたがっているので、私はただできるとは思いません。

App.SaleRecord.find({ book.title: critera });

本はbelongsToレコードです。

そのルートのコントローラーで、少なくともデータをクエリするために持っているものは次のとおりです。これは期待どおりに機能します。

App.SaleRecordsController = Ember.ArrayController.extend({
  search: function() {
    $.getJSON('/search?criteria=' + $('.criteria').val(), function(data) {

    });
  }
});

しかし、私はここから何をすべきかわかりません。

  1. 過去10件の結果の一部であるために、一部のレコードがすでにストアにある場合、最初にそれらをアンロードする必要がありますか?
  2. jsonハッシュからストアにデータをロードするにはどうすればよいですか?レコードを作成してデータを取り込む方法を知っているので、データをループできますが、ライナーが1つあるのではないかと思います。

ありがとう。質問が明確だったと思います:)

4

1 に答える 1

4

主にこの質問/回答のおかげで、答えを見つけることができました: Ember.js Ajax call is not working as expected

ajax 呼び出しをコントローラーからモデル関数に移動しました。リンクされた質問のように、コントローラーで呼び出すカスタム関数を作成しました。

LocalBookFinder.SaleRecord = DS.Model.extend({
  isbn: DS.attr('string'),
  price: DS.attr('number'),
  condition: DS.attr('string'),
  book: DS.belongsTo('LocalBookFinder.Book')
});

LocalBookFinder.SaleRecord.reopenClass({
  search: function(criteria) {
    var result = Ember.ArrayProxy.create({content: []});
    var _this = this;
    $.getJSON('/search?criteria=' + criteria, function(data) {
      var ids = [];
      var arr = data.sale_records;
      for(var i = 0; i < arr.length; i++) {
        var sale_record = arr[i];
        if(ids.indexOf(sale_record.book_id) == -1) {
          ids.push(sale_record.book_id);
        }
      }

      var ajax_count = ids.length;
      var sale_records = [];
      for(var i = 0; i < ids.length; i++) {
        $.getJSON("/books/" + ids[i], function(data) {
          for(var j = 0; j < arr.length; j++) {
            var sale_record = arr[j];
            if(sale_record.book_id == data.book.id) {
              sale_record.book = data.book;
              sale_records.push(sale_record);
            }
          }
          if(i == ajax_count) {
            console.log(sale_records);
            result.set('content', sale_records);
          }
        });
      }
    });
    return result;
  }
});

次に、コントローラーで次のことを行います。

search: function() {
  var _this = this;
  var result = LocalBookFinder.SaleRecord.search($('.criteria').val());
  this.set('content', result);
}

モデル内の検索機能の最初の ajax ビットはかなり簡単だと思います。データを要求し、それを格納する空の ember 配列プロキシを設定します。今、子レコードから本の画像とタイトルを読み込んでいるので、それらを個別に呼び出す必要があります。したがって、最初の結果セットでは、リクエストする必要がある本の ID の配列を入力します。各 ajax 呼び出しで、販売レコードの配列を調べて、book プロパティを結果のハッシュ データに設定します。(カウンターを介して) 完了したら、JSON データを使用して結果のコンテンツを設定します。

于 2013-03-27T20:36:47.807 に答える