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 });

Book 是 belongsTo 记录。

在该路由的控制器中,这是我至少用于查询数据的内容,它按预期工作:

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

    });
  }
});

但我不确定从这里做什么。

  1. 如果某些记录由于是最近 10 个结果的一部分而已经在商店中,我需要先卸载它们吗?
  2. 如何从 json 哈希将数据加载到存储中?我知道如何创建记录并填充它,所以我可以遍历数据,但我想知道是否有一个衬里。

谢谢。我希望问题很清楚:)

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 回答