2017-09-13 2 views
1

私のコンポーネントでfindAllを使用して少し問題があります。それは最後に返す価値に関係します。Ember - findAllと約束

users: Ember.computed(function() { 
return this.get('store').findAll('user'); 
}), 

私の場合、最初のオブジェクトの名前を取得します。したがって、私のハンドルバーで:

users.firstObject.name 

この場合、「ユーザー」はクラスです。

user: Ember.computed(function() { 
    return this.get('store').findAll('user') 
    .then(function(user){ 
     return user.get('firstObject'); 
    }); 
    }), 

をしかし、この場合には、私のハンドルで、user.nameは未定義であり、ユーザが約束です:しかし、私はこのように、プロパティに直接最初のオブジェクトを返すようにしようとしています。彼らがどのように働くのか、私が約束で理解できないことがあります... 誰かが私のユーザーに「firstObject」を使わずに正しいユーザーを手に入れることができますか? ありがとうございます!

+0

コンポーネントは、デフォルトでは、渡されたもの以外のデータに気付かないようにセットアップされますが、これはストアのインポートで実行できます。あなたはルータでfindAllを持って、それをモデルに戻すべきです。そのモデルをコンポーネントに渡すことができます。その点から、実際にはtoArray()を使用して約束したレコードを解決するのは本当に簡単ですし、配列の最初のレコードを取得できます。 'this.get( 'model')。toArray()[0]' – BrandonW

答えて

0

あなたの問題を解決するための最短の方法はember-promise-helpersアドオンをインストールすると、以下のようにテンプレートでそれを適用することです:

{{#if (await user)}} 
    {{get (await user) 'name'}} 
{{/if}} 

しかし、私の知る限り、それは計算されたプロパティの値として約束を使用することは推奨されません、あなたはまだそれを行うことができます。ここでは、Ember.PromiseProxyMixinの場合はdocumentationをお勧めしますが、フォーラムスレッドをいくつか(古いものもありますが)表示する場合はthis oneなどです。

+0

ありがとう、私は見てみましょう! – Seybol

0

あなたが持っている問題は約束ではなく、計算されたプロパティをどのように使用しているかと思います。

findRecord/findAllに最適な場所は、ルートのモデルフックです。 firstObjectをあなたが記述しているものに依存しないことが最善です。アプリのバックエンドデータが変更されると、どのレコードが最初に表示されるかについての保証はありません。

計算されたプロパティは、実際に他のデータを見て、そのデータに関する表示情報を更新するためのものであり、ストアから物事を自分で取り出すためのものではありません。彼らは、彼らが更新を見ていると思われるデータの名前である引数を必要とします。あなたの計算されたプロパティは何も見ていないので、決して起動しません。ここに例があります。

firstName: null, 
    lastName: null, 

    fullName: Ember.computed('firstName', 'lastName', function() { 
    let firstName = this.get('firstName'); 
    let lastName = this.get('lastName'); 

    return `${firstName} ${lastName}`; 
    }) 

ガイドでComputed Propertiesの詳細を読むことができます。

findRecordを使用してユーザーの情報を取得したルートにモデルフックを定義し、それを子コンポーネントに渡すか、異なるルート上の多くの異なるコンポーネントがユーザーを必要とする場合にサービスに設定すると、情報。