【问题标题】:Accessing controller properties within Ember Data REST Adapter在 Ember 数据 REST 适配器中访问控制器属性
【发布时间】:2013-11-06 17:41:00
【问题描述】:

我需要访问控制器属性以在我的 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/customers/: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 的一个实例。

我的问题是,如何在我的CustomerAdapter 中访问我的AccountController 的属性?以下是我尝试过的方法,没有奏效:

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 外部的全局变量中,然后在适配器中从那里访问它。

其他建议?

【问题讨论】:

    标签: ember.js ember-data


    【解决方案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);
       }
    });
    

    【讨论】:

    • 是的,我想到了使用元数据类似的东西,但它仍然是一个美化的全局变量。我可能需要对人际关系感到沮丧和肮脏。我在 RESTAdaptor 中看到了一个 findHasMany 方法,但我还没有弄清楚如何使用...
    • 这是一个内部方法:)
    • @Kingpin2k Ember.js 仍然不支持更直接的方式。你同意吗?
    • 不,我不同意 ;) Ember Data 和 Ember.JS 是两个不同的产品,Ember.JS 可以在没有 Ember Data 的情况下工作。如果您要说 Ember Data 仍然不支持更直接的方式,那我绝对同意。
    • @Kingpin2k 哦!谢谢你的区别。 :-)
    【解决方案2】:

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

    我看到你尝试了一些类似的方法,但无论如何这可能适用于适配器:

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

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

    也许通过适当的路由可以实现自动 URL?

    【讨论】:

    • 是的,从另一个控制器访问控制器效果很好,但这对适配器不起作用:(我可以将 accountId 属性添加到模型中,但我看不出这到底有什么帮助,因为我不能当我进行查询以获取帐户的所有客户时,真正读取模型实例。正确路由是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2017-10-06
    • 2015-10-11
    • 1970-01-01
    • 2023-03-07
    • 2014-05-26
    相关资源
    最近更新 更多