ember动态适配器主机更新

时间:2014-10-21 05:50:09

标签: ember.js ember-data

我有一个这样的适配器:

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

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

这已经有一段时间了,但最近出现了问题。我的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获取记录。我希望这是有道理的。这甚至可能吗?

2 个答案:

答案 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
  }
相关问题