4

私は、begsTo / hasMany 関係を持つユーザー モデルとワークスペース モデルを持っています。

App.User = DS.Model.extend({
  name: DS.attr('string'),
  workspace: DS.belongsTo('App.Workspace')
});

App.Workspace = DS.Model.extend({
  name: DS.attr('string'),
  users: DS.hasMany('App.User')
});

コントローラーのモデル プロパティが有効なユーザーに設定されたコントローラーとビューのセットアップがあります。

App.ApplicationRoute = Ember.Route.extend({
  setupController: function() {
    this.controllerFor('test').set('model', App.User.find(1));
  }
});

次のコードと出力は、コードの実行時に belongsTo アソシエーションがロードされていないことを示しています。ビュー クラスから (ユーザーを介して) ワークスペースにアクセスする適切な方法は何ですか?

App.TestView = Ember.View.extend({

  didInsertElement: function() {
    var self = this;

    console.log('first try: ');
    console.log(this.get('controller.model.workspace'));

    setTimeout(function() {
      console.log('second try: ');
      console.log(self.get('controller.model.workspace'));
    }, 1000);
  }
});

出力;

// first try: 
// null 
// second try: 
// Class { ... }

{{model.workspace}} を介してテンプレートのワークスペースにアクセスできます — ビュー クラスで同じことを行うにはどうすればよいですか?

4

1 に答える 1

10

ビュークラスから(ユーザーを介して)ワークスペースにアクセスする適切な方法は何ですか?

あなたの方法this.get('controller.model.workspace')は、あなたの視点からワークスペースにアクセスする正しい方法です。しかし、あなたの例が示すように、didInsertElement()フックはそれを行うのに間違った場所です。は非同期であるため、テンプレートがレンダリングされているときに利用可能である(またはそれ自体でさえ)ことApp.User.find(1)を期待することはできません。そのため、console.logは最初にnullを返します。model.workspacemodel

Emberは、明示的な形式の非同期動作を排除するために非常に懸命に取り組んでいるため、これはおそらく明らかではありません。モデル参照がすぐに返されるためApp.User.find()、同期すると予想されるかもしれませんが、そうではありません。詳細については、 managing-asynchronyをご覧ください。

{{model.workspace}}を介してテンプレートのワークスペースにアクセスできます—ビュークラスで同じことを行うにはどうすればよいですか?

舞台裏では、ハンドルバーが{{model.workspace}}モデルにバインドされ、値が変更されたときにテンプレートが再レンダリングされます。ビュークラスから同様の手法を使用する必要があります。達成しようとしていることに応じて、バインディング、計算されたプロパティ、またはオブザーバーを使用することをお勧めします。例えば:

App.TestView = Ember.View.extend({

  workspaceChanged: function() {
    console.log('workspaceChanged to: ');
    console.log(this.get('controller.model.workspace'));        
  }.observes('controller.model.workspace')

});

バインディングも参照してください。オブザーバー、計算されたプロパティ:いつ何を使用しますか?

于 2013-01-30T22:36:25.580 に答える