在我正在进行的系统上,我不得不尝试驯服一下有关它如何处理REST请求的ember-data。默认情况下,ember-data表示模型特定请求的URL的方式不会用我正在使用的后端来删除它。
我需要的是,让ember-data使用ember正在加载的相同的 URL,但带有'?json'后缀。也就是说,如果ember将页面切换到我的band页面,并且url是/ bands,我希望ember-data请求/ band?json获取它需要的数据,而不是从模型名称中得到的数据。可以说,我希望从加载路径的路径计算URL,而不是从正在使用的模型的名称计算。
我已经尝试通过子类化DS.RESTAdapter {}看看我是否可以使用buildURL方法来执行此操作,但我无法弄清楚如何获取URL ember将要加载。在ember更改位置之前调用buildURL方法,因此我不能使用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发出的请求与路径路径的URL相同。
答案 0 :(得分: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
方法的详细信息,请参阅here。
希望它有所帮助