1

同じコンセントにロードするコントローラーが2つあるので、一度にアクティブにできるのは1つだけです。どちらも、次のような3番目のコントローラーのプロパティを監視します。

App.SearchController = Ember.ObjectController.extend({
    needs: ['navigation'],

    updateResults: function () {
        console.log('load search data');
    }.observes('controllers.navigation.search')
});

完全なサンプル

http://jsfiddle.net/FMk7R/1/

プロパティが変更されると、一部のデータがフェッチされます。両方のリンクをクリックして両方をロードすると、プロパティが変更されると、両方のコントローラーがobservesイベントを受信し、データをロードします。表示されているものだけにデータをロードしたいのですが。

どのコントローラーが現在アクティブであるかを把握し、アクティブなコントローラーにのみデータをロードするにはどうすればよいですか?

4

1 に答える 1

3

理想的には、コントローラーはそれらがアクティブであることを認識してはなりません。1つの代替方法は、関係を反転して、NavControllerが「アクティブな」コントローラーのクエリプロパティの変更を担当するようにすることです。

**更新-コメントに基づいて例を追加**

App.SearchRoute = Ember.Route.extend({
  setupController: function(controller) {
      this.controllerFor('navigation').set('active', controller);
  }
});

App.ImagesRoute = Ember.Route.extend({
  setupController: function(controller) {
      this.controllerFor('navigation').set('active', controller);
  }
});

App.SearchController = Ember.ObjectController.extend({
  loadResults: function (query) {
    console.log('loading web search data for: ', query);
  }
});

App.ImagesController = Ember.ObjectController.extend({
  loadResults: function (query) {
    console.log('loading image search data for: ', query);
  }
});

App.NavigationController = Ember.ObjectController.extend({
  search: '',
  active: null,
  searchDidChange: function() {
    this.get('active').loadResults(this.get('search'));
  }.observes('search', 'active')
});

http://jsfiddle.net/F3uFp/1/を参照してください

もう1つの方法は、代わりに計算されたプロパティを使用することです。Emberは、アクティブなビューをレンダリングするために実際に必要な計算されたプロパティのみを更新します。例えば:

    App.SearchController = Ember.ObjectController.extend({
        needs: ['navigation'],
        results: function () {
           console.log('loading web search data');
           return("web search results");
        }.property('controllers.navigation.search')
    });

ここで更新されたフィドルを参照してください:http://jsfiddle.net/ZTnmp/

http://jsfiddle.net/FMk7R/1/

于 2013-02-18T19:44:54.977 に答える