3

子が埋め込まれた hasMany を持つモデルを使用していました。これは問題なく、 model.get('children') を呼び出すたびにすべてが機能しました。

その children プロパティを async:true に変更しましたが、これを処理する方法に関する適切なドキュメントが見つからないようです。

例を挙げましょう。簡単にするために、簡略化された json を使用して Ember のセットアップを表します。

次のようなモデルがあるとします。

model:{
 hasMany: {children: {async: true} },
 isActive: boolean
}

次のようなテンプレートがあるとします。

{{#if lastChildIsActive}}
  <p>I'm the last one!</p>
{{/if}}

そして、私はControllerを持っています:

controller:{
 lastChildIsActive: function(){
  return this.get('model').get('children').get('lastObject').get('isActive')
 }
}

わかりました、async: false が使用されていたときのこのセットアップでは、すべてがうまくいきました。

しかし今、async が true の場合、.get('children') SOMETIMES のコントローラーでのその呼び出しは、私が推測する非同期であるため、何も返しません。

これで、promise を使用して、コントローラーを次のようにリファクタリングできます。

controller:{
 lastChildIsActive: function(){
  this.get('model').get('children').then(function(children){

    return children.get('lastObject').get('isActive');

  });
 }
}

2 番目のリファクタリングの問題は、isActive 値を返さなくなり、Promise オブジェクトを返すようになったことです。

しかし、テンプレートは約束を望んでおらず、戻り値が必要です。

SO、約束の代わりに呼び出しの実際の結果を返すことができる一方で、非同期がロードされたことを確認するにはどうすればよいですか?

4

2 に答える 2

2

ビューと didInsertElement を使用して、親の子を取得し、テンプレートに表示されるコントローラーの属性を更新できます。

App.IndexView = Ember.View.extend({
  didInsertElement: function() {
    controller = this.get('controller');
    controller.get('model').get('children').then(function(children){
      active = children.get('lastObject').get('active');
      controller.set('lastChildIsActive', active);
    });
  }
});

このフィドルを参照してください: http://jsfiddle.net/f9DAc/2/

于 2014-05-22T00:00:55.333 に答える
1

オブザーバーを使用して、子の変更をリッスンする必要があります。lastChildIsActive以下のメソッドで行った変更を参照してください。children は配列型なので、「children.@each」をリッスンしています。「こども」に変化があれば、lastChildIsActive自動的に更新されます。

controller:{
 lastChildIsActive: function(){
  return this.get('model').get('children').get('lastObject').get('isActive')
 }.property('children.@each')
}
于 2014-05-21T11:34:58.103 に答える