ember动态适配器主机更新

Gev*_*ous 4 ember.js ember-data

我有一个像这样的适配器:

var Adapter = DS.RESTAdapter.extend({
    host: 'http://localhost:4200'
});

if (config.environment === 'production') {
    Adapter.reopen({
       host: 'http://foo.example.com'
    });
}
Run Code Online (Sandbox Code Playgroud)

这已经有一段时间了,但最近出现了问题.我的ember应用程序与许多不同的子域(例如foo.example.combar.example.com)接口.我的理解是reopen改变所有实例,这就是我认为发生的事情.当我浏览到'/ bar'时,它在生产中使用正确的适配器,但浏览到'/ foo'仍然使用bar.example.com端点.

我的问题是双重的.首先,我在这里使用正确的方法吗?

其次,我想根据运行时设置更改适配器.我需要解决IE8缺乏CORS支持所以我认为如果我有一个ie8开关,适配器应该打example.com/foo而不是foo.example.com.在我看来,这两个领域在概念上是相关的,但我很高兴出错.

更新

为简化起见,我基本上想找到请求的主机名并将其传递给适配器.例如,如果我浏览到www.example.com我希望适配器从中获取记录www.example.com/foo,或者在浏览时www.example2.com我希望适配器从中获取记录www.example2.com/foo.我希望这是有道理的.这甚至可能吗?

GJK*_*GJK 5

我对此并不是百分之百确定,但我的猜测是该值正在被缓存.我的建议是制作host一个易变的计算属性.这对您来说实际上更好,因为这将允许您根据运行时配置更好地选择主机.尝试这样的事情:

var Adapter = DS.RESTAdapter.extend({
    host: function() {
        if (config.environment === 'production') {
            return 'http://foo.example.com';
        } else {
            return 'http://localhost:4200';
        }
    }.property().volatile()
});
Run Code Online (Sandbox Code Playgroud)

因为Ember-Data总是使用Ember的get方法来获取属性,所以host从普通属性变为计算属性应该没有区别.因此,您可以在运行时选择主机,并确保每次都计算它.(不要担心不缓存该值的性能,我保证不会产生明显的差异.)