访问Ember Data REST Adapter中的控制器属性

时间:2013-11-06 17:41:00

标签: ember.js ember-data

我需要访问一个控制器属性来在我的RESTAdapter实例中构建自定义URL,但我找不到在适配器上下文中访问控制器的方法。这就是我所拥有的:

我有一个看起来像这样的简单模型:

App.Customer = DS.Model.extend(
{
    first_name:     DS.attr('string'),
    last_name:      DS.attr('string'),
    date_of_birth:  DS.attr('string'),
    created_at:     DS.attr('string'),
    updated_at:     DS.attr('string')
});

此模型的资源REST URL如下所示: https://api.server.com/v1/accounts/:ACCOUNT_ID /客户/的:CUSTOMER_ID

我正在为大多数模型扩展Ember Data中的RESTAdapter,因此我可以单独自定义资源URL。像这样:

App.CustomerAdapter = DS.RESTAdapter.extend(
{
    buildURL: function(type, id)
    {
        // I need access to an account_id here:
        return "new_url";
    }
});

如您所见,在此示例中,我需要URL中的帐户ID才能查询客户对象。帐户ID是用户登录时必须提供的内容,并存储在AccountController Ember.Controller的实例中。

我的问题是,我如何通过AccountController内的CustomerAdapter访问媒体资源?以下是我尝试过的事情,有效:

App.CustomerAdapter = DS.RESTAdapter.extend(
{
    buildURL: function(type, id)
    {
        var account_id = this.controllerFor('account').get('activeAccount').get('id');
        return "new_url";
    }
});

App.CustomerAdapter = DS.RESTAdapter.extend(
{
    needs:                ['account'],
    accountController:    Ember.computed.alias("controllers.account"),

    buildURL: function(type, id)
    {
        var account_id = this.get('accountController').get('activeAccount').get('id');
        return "new_url";
    }
});

App.CustomerAdapter = DS.RESTAdapter.extend(
{
    activeAccountBinding = Ember.Binding.oneWay('App.AccountController.activeAccount');

    buildURL: function(type, id)
    {
        var account_id = this.get('activeAccount').get('id');
        return "new_url";
    }
});

此时,我能想到的唯一黑客就是将帐户ID放在Ember之外的全局变量中,并从适配器中的那里访问它。

其他建议?

2 个答案:

答案 0 :(得分:1)

我们有类似的问题,基本上我们做了一个全局变量,并对此感到内疚。我们的是Ember模型,但存在相同的概念和问题。另一种解决方案是使用findQuery,但这会返回一个集合,因此您必须将该项目从集合中拉出。

App.CustomerAdapter = DS.RESTAdapter.extend(
{
    buildURL: function(type, id)
    {
        var params = type.params;
        return "new_url" + params.account_id;
    }
});

在某些路线中:

App.BlahRoute = Em.Route.extend({

   model: function(params){
      App.Customer.params = {account_id:123};
      this.get('store').find('customer', 3);
   }
});

答案 1 :(得分:0)

我知道您可以在另一个控制器的上下文中访问控制器的属性。

我看到你尝试过有点类似,但无论如何这可能适用于适配器:

App.YourController = Ember.ObjectController.extend({
    needs: ['theOtherController'],
    someFunction: function () {
        var con = this.get('controllers.theOtherController');
        return con.get('propertyYouNeed');
    },
});

另外,您是否考虑过将AccountId属性添加到Customer模型中?

也许通过正确的路由可以实现自动URL?