使ember数据使用ember为REST请求加载的URL

使ember数据使用ember为REST请求加载的URL,rest,ember.js,ember-data,Rest,Ember.js,Ember Data,在我现在正在开发的系统上,我不得不尝试稍微控制一下余烬数据,了解它是如何执行REST请求的。默认情况下,余烬数据表示某个模型请求的URL不会用我正在使用的后端进行剪切 我需要的是,让ember数据使用ember正在加载的相同URL,但带有“?json”后缀。也就是说,如果ember将页面切换到my band页面,并且url为/bands,那么我希望ember数据请求/bands?json以获取它所需的数据,而不是模型名称中的数据。可以说,我希望URL是从加载路径的路径计算出来的,而不是从所使用的

在我现在正在开发的系统上,我不得不尝试稍微控制一下余烬数据,了解它是如何执行REST请求的。默认情况下,余烬数据表示某个模型请求的URL不会用我正在使用的后端进行剪切

我需要的是,让ember数据使用ember正在加载的相同URL,但带有“?json”后缀。也就是说,如果ember将页面切换到my band页面,并且url为/bands,那么我希望ember数据请求/bands?json以获取它所需的数据,而不是模型名称中的数据。可以说,我希望URL是从加载路径的路径计算出来的,而不是从所使用的模型的名称计算出来的

我已经尝试过将DS.RESTAdapter{}子类化,看看是否可以使用buildURL方法来实现这一点,但我不知道如何获取ember将要加载的URL。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.RouterSignature=[
['index'、'/'、'/index_models'],
['bands'、'/bands'、'/band_models'],
['band','/band/:band_slug','/band_model']
];
App.Router.map(函数(){
对于(变量i=0;i
现在App.Routes和DS.RESTAdapter.buildURL基于相同的数据。App.RouterSignature列表中的前两个值只是路由的名称,即路由的路径。第三个值是DS.RESTAdapter.buildURL默认猜测应该是url。然后,我的自定义适配器接受该猜测,将其与App.RouterSignature列表中的一个项目匹配,然后从该项目中获取第二个值-路由路径


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

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

 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
方法的更多信息,请参阅。
希望有帮助

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

 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
方法的更多信息,请参阅。
希望它有帮助

您是否有RESTAdapter设置来挂接
buildURL
方法?如果是,你有没有看一下这个答案:也许你看到了一些你还没有尝试过的东西?@inuitivepixel:看起来像是我可以使用的东西,但我的问题是,在buildURL中,我没有访问路由的权限,只有记录的名称。路线和模型之间没有一对一的关系,因此我无法通过查看模型来猜测路线的名称。这是不一致的。请另外告诉我:Ddo您是否仍有RESTAdapter设置来挂接
buildURL
方法?如果是,你有没有看一下这个答案:也许你看到了一些你还没有尝试过的东西?@inuitivepixel:看起来像是我可以使用的东西,但我的问题是,在buildURL中,我没有访问路由的权限,只有记录的名称。路线和模型之间没有一对一的关系,因此我无法通过查看模型来猜测路线的名称。这是不一致的。请另外告诉我:d问题是,记录包含正在使用的模型的名称,并且它基于该名称创建URL。但是我不希望请求与模型的名称有任何关系。它应该由正在使用的路由路径生成,因此如果我的路由路径是/bands/band name,那么URL应该是/bands/band name?json.Nope,而不是。我的意思是,现在,record变量包含ember data需要对其执行操作的模型的名称。所以,如果我的模型名为“horse”,并且它是一个相同页面加载的get请求,那么buildURL将返回“horses?json”。但在我的例子中,如果正在加载的路由路径是“/my horses”,并且模型名为“horse”,我希望buildURL返回“my horses?json”。问题是,记录包含正在使用的模型的名称,它将URL基于该名称。但是我不希望请求与模型的名称有任何关系。它应该由正在使用的路由路径生成,因此如果我的路由路径是/bands/band name,那么URL应该是/bands/band name?json.Nope,而不是。我的意思是,现在,record变量包含ember data需要对其执行操作的模型的名称。所以,如果我的模型名为“horse”,并且它是一个相同页面加载的get请求,那么buildURL将返回“horses?json”。但在我的例子中,如果加载的路由路径是“/我的马”,并且模型名为“马”,我希望buildURL返回“我的马?json”。