1

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

リソース URL を個別にカスタマイズできるように、ほとんどのモデルで Ember Data の RESTAdapter を拡張しています。このような:

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私の質問は、 my内から my プロパティにアクセスするにはどうすればよい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 外のグローバル変数に入れ、そこから Adapter 内でアクセスすることです。

他の提案?

4

2 に答える 2

1

同様の問題があり、基本的にグローバル変数を実行し、それについて罪悪感を感じます。私たちのものは Ember Model ですが、同じコンセプトと問題が存在します。もう 1 つの解決策は 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);
   }
});
于 2013-11-06T18:10:33.907 に答える