我有一个这样的适配器:
var Adapter = DS.RESTAdapter.extend({
host: 'http://localhost:4200'
});
if (config.environment === 'production') {
Adapter.reopen({
host: 'http://foo.example.com'
});
}
这已经有一段时间了,但最近出现了问题。我的ember应用程序与许多不同的子域接口(例如foo.example.com
和bar.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
获取记录。我希望这是有道理的。这甚至可能吗?
答案 0 :(得分:5)
我对此并不是100%肯定,但我的猜测是该值正在被缓存。我的建议是使host
成为易变的计算属性。这对您来说实际上更好,因为这将允许您根据运行时配置更好地选择主机。尝试这样的事情:
var Adapter = DS.RESTAdapter.extend({
host: function() {
if (config.environment === 'production') {
return 'http://foo.example.com';
} else {
return 'http://localhost:4200';
}
}.property().volatile()
});
因为Ember-Data总是使用Ember的get
方法来获取属性,所以将host
从普通属性更改为计算属性应该没有区别。因此,您可以在运行时选择主机,并确保每次都计算它。 (不要担心不缓存该值的性能,我保证不会产生明显的差异。)
答案 1 :(得分:0)
import ENV from 'ember-arp-roomviewer/config/environment';
export default DS.JSONAPIAdapter.extend({
namespace: 'arp/v1',
//host: 'http://localhost/arp/index.php/wp-json',
//host: 'http://www.acme.net/myroomplan/wp-json',
host: function() {
if (ENV.environment === 'production') {
return 'http://www.acme.net/myroomplan/wp-json';
} else {
return 'http://localhost/arp/index.php/wp-json';
}
}.property().volatile(),
headers: {
'Content-type': 'text/plain' // Stops OPTION headers being sent PITA
}