3

我发现的教程和指南表明 Ember.js 模型非常以数据为中心,因为您在浏览器中拥有持久保存到服务器的数据和/或模型填充了来自服务器的数据。

以动词为中心的东西怎么样?例如,我的情况是,到目前为止,我有一个“搜索”模型,其中搜索有一个查询、一个状态(“beforesearch”、“duringsearch”等),并且希望有一些结果。我希望搜索然后是“runQuery”,它会触发对服务器的 ajax 请求,服务器返回并用结果填充模型,并将其状态更改为“aftersearch”。

在模型上处理此类动词的最佳方法是什么?“runQuery”应该通过 ember-data 进行,还是使用 $.ajax 或类似工具手动触发?我是否可能以错误的方式考虑模型,而这实际上应该通过控制器进行?

编辑:在阅读了一些关于 REST 的内容之后,我想我想要的是发布到“控制器”资源。因此,例如:

POST:/searches(创建搜索)

POST:/searches/1/run(执行搜索 1 的“运行”控制器

Ember.js / ember-data 是否有推荐的调用控制器资源的方法?

4

1 回答 1

3

Ember-data 非常注重使用包含各种信息字段和关系并由唯一 ID 定义的模型对象。我的 API 的一半就像 ember-data 所期望的那样,一半就像你描述的那样,它更多的是关于数据处理或执行计算,而不是创建/检索/更新/删除具有 id 的数据对象。将这些计算视为相同并为其分配一个 id 并将其保存在数据库中是没有意义的。

就我而言,由于我同时拥有 ember-data 样式的数据对象和计算功能,因此我混合使用了 ember-data 和自定义 ajax 请求。我存储了由 ember-data 检索的关系数据,但我扩充了模型以包括对计算部分的访问。

例如:

App.Event = DS.Model.extend({
  name: DS.attr('string'),
  items: DS.hasMany('App.Item'),
  ...etc...

  searchData: null,
  searchInEvent: function(data) {
    var _this = this;
    return $.ajax({
      url: "/api/events/" + this.get('id') + "/search/",
      dataType: 'json',
      type: 'POST',
      data: data
    }).then(function(result){
      _this.set('searchData', result);
    });
  }
});

App.Event是一个普通的 ember-data 模型,由路由器通过通常的 ember 约定加载,并且由于各种控制器需要访问搜索功能,它们可以访问它searchInEventsearchData添加到模型中。

于 2013-03-23T13:35:28.910 回答