1

在我现在正在使用的系统上,我不得不尝试驯服 ember-data 以了解它如何处理其 REST 请求。默认情况下,ember-data 计算某个模型请求的 URL 的方式不会与我正在使用的后端一起削减它。

我需要的是,让 ember-data 使用与 ember 加载相同的URL,但带有 '?json' 后缀。也就是说,如果 ember 将页面切换到我的乐队页面,并且 url 是 /bands,我希望 ember-data 请求 /bands?json 以获取它需要的数据,而不是从模型名称中得出的任何数据。有人可能会说,我希望根据加载路径的路径计算 URL,而不是根据正在使用的模型的名称。

我已经尝试通过子类化 DS.RESTAdapter{} 并查看是否可以获得 buildURL 方法来执行此操作,但我无法弄清楚如何获取将加载的 URL ember。buildURL 方法是在 ember 更改位置之前调用的,所以我不能使用 document.location.href 什么的。我可以想象我需要一种方法来询问 ember 现在正在加载什么,以及 URL 是什么。

关于如何做到这一点的任何想法?

更新

没有任何令人满意的解决方案,所以我决定用肮脏的方式来做。就是这个:

App.RouterSignature = [
    ['index',        '/',                   '/index_models'],
    ['bands',        '/bands',              '/band_models'],
    ['band',         '/band/:band_slug',    '/band_model']
];

App.Router.map(function() {
    for (var i = 0; i < App.RouterSignature.length; i++) {
        var route = App.RouterSignature[i];
        this.resource(route[0], {path: route[1]});
    }
});

App.CustomAdapter = DS.RESTAdapter.extend({
    buildURL: function(record, suffix) {
        var url,
            suffix = '?json',
            needle = this._super(record);

        for (var i = 0; i < App.RouterSignature.length && !url; i++) {
            var route = App.RouterSignature[i];
            if (route[2] == needle)
                url = route[1];
        }

        return url + suffix;
    }
});

现在 App.Routes 和 DS.RESTAdapter.buildURL 基于相同的数据。App.RouterSignature 列表中的前两个值只是路由的名称,路由的路径。第三个值是 DS.RESTAdapter.buildURL 默认猜测应该是 url。然后,我的自定义适配器接受该猜测,将其与 App.RouterSignature 列表中的一项匹配,然后从该项中获取第二个值 - 路由路径。

现在 ember-data 发出的请求与路由路径相同。

4

1 回答 1

1

您可以尝试像这样设置您的适配器:

 App.Adapter = DS.RESTAdapter.extend({
   ...
   buildURL: function(record, suffix){
     return this._super(record, suffix) + "?json";
   }
 });

 App.Store = DS.Store.extend({
   ...
   adapter: App.Adapter.create();
   ...
 });

有关RESTAdapter方法的更多信息,请参见此处。buildURL希望能帮助到你

于 2013-05-16T07:41:12.503 回答