为ember-data设置资源url

时间:2014-05-07 04:28:43

标签: ember.js ember-data

ember应用程序具有以下模型。

App.Book = DS.Model.extend
  title = DS.attr('string')
  pages = DS.attr('number')
  chapters = DS.hasMany('bookChapter')

App.BookChapter = DS.Model.extend
  title = DS.attr('string')
  begin = DS.attr('number')
  end   = DS.attr('number')

我注意到App.Book向/ api / books和App.BookChapter请求/ api / bookChapters 有什么方法可以向/ api / books / {id} / chapter或/ api / book_chapters提出请求吗?book = {id}

我需要这个才能工作,因为我无权更改api端点网址。

我的ember.js环境是

DEBUG: Ember      : 1.5.0
DEBUG: Ember Data : 1.0.0-beta.7+canary.f482da04
DEBUG: Handlebars : 1.3.0
DEBUG: jQuery     : 1.11.0

1 个答案:

答案 0 :(得分:0)

适配器负责将存储操作转换为持久层。

由于您未遵循RESTAdapter约定,因此您需要创建自定义适配器以与特定API进行通信。最简单的方法是扩展RESTAdapter,其实现对您的API是关闭的。

App.ApplicationAdapter= DS.RESTAdapter.extend({
  namespace: 'api',
  pathForType: function(type) {
    var decamelized = Ember.String.decamelize(type);
    return Ember.String.pluralize(decamelized);
  },
  findQuery: function(store, type, query) {

    var params = [];
    Object.keys(query).forEach(function (key) { 
       var param = key+'='+encodeURIComponent(query[key]);
       params.push(param);
    });
    params = params.join('&');

    var url = this.buildURL(type.typeKey);
    url = [url, params].join('/?');
    return this.ajax(url, 'GET');
  }

});

我已经写了findQuery,因为你没有通过模型主键查询find('bookChapter',1)。然后你将请求作为:

App.ChapterRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.find('bookChapter', {book: params.book_id});
  }
});

如果您的API不同于通信或序列化惯例,则需要扩展RESTSerializerRESTAdapter(检查DOC以了解应覆盖哪些方法)。

示例:http://emberjs.jsbin.com/kocoh/1/edit