在emberjs中重新加载当前路线

时间:2013-08-06 13:51:31

标签: javascript asynchronous ember.js

我目前有一个控制器可以对数据列表进行异步加载。 在其他几个控制器中,我有一些功能可以观察何时加载完成并重新加载某些模型。

我项目的小型设置:

App.SyncController = Ember.ObjectController.extend({
  finished: false,

  init: function() {
    var self = this;
    $.get('/data', function(data) {
      // Process data
      self.set('finished', true);
    });
  }
});

App.OverviewController = Ember.ObjectController.extend({
  needs: ['sync'],

  finishedSyncingObserver: function() {
    // Reload or update some data in this controller
  }).observes('controllers.sync.finished')
});

App.DetailController = Ember.ObjectController.extend({
  needs: ['sync'],

  finishedSyncingObserver: function() {
    // Reload or update some data in this controller
  }).observes('controllers.sync.finished')
});

在这个例子中,当jQuery完成时,两个观察者都被调用。但是,是否可以看到哪个控制器处于活动状态,因此只执行一个观察者?

由于

1 个答案:

答案 0 :(得分:1)

虽然我不得不承认@Marcio在他的评论中是正确的,因为控制器的init函数只被调用一次,但是不知道你确切的用例它可能是好的,因此这里有两个一种天真的方法。

如何使用两个不同的布尔值,并观察这些

App.SyncController = Ember.ObjectController.extend({
  finishedOverview: false,
  finishedDetail: false,

  init: function() {
    var self = this;
    $.get('/data', function(data) {
      // Process data
      if(thereIsDataForDetail) {
        self.set('finishedDetail', true);
      }
      if(thereIsDataForOverview) {
        self.set('finishedOverview', true);
      }
    });
  }
});

App.OverviewController = Ember.ObjectController.extend({
  needs: ['sync'],

  finishedSyncingObserver: function() {
    // Reload or update some data in this controller
  }).observes('controllers.sync.finishedOverview')
});

App.DetailController = Ember.ObjectController.extend({
  needs: ['sync'],

  finishedSyncingObserver: function() {
    // Reload or update some data in this controller
  }).observes('controllers.sync.finishedDetail')
});

或者反过来没有努力的观察者

App.SyncController = Ember.ObjectController.extend({
  needs: ['overview', 'detail'],

  init: function() {
    var self = this;
    $.get('/data', function(data) {
      // Process data
      if(thereIsDataForDetail) {
        self.get('controllers.detail').send('setNewData', data);
      }
      if(thereIsDataForOverview) {
        self.get('controllers.overview').send('setNewData', data);
      }
    });
  }
});

App.OverviewController = Ember.ObjectController.extend({
  setNewData: function(data) {
    // Reload or update some data in this controller
  })
});

App.DetailController = Ember.ObjectController.extend({
  setNewData: function(data) {
    // Reload or update some data in this controller
  })
});

当然,如果您有两个以上依赖sync控制器的控制器,这种简单的方法就无法很好地扩展。

编辑以回应您的上次评论

如果你需要在任何时间点的当前路线,你可以这样做:

var App = Ember.Application.create({
  currentPath: ''
});

App.ApplicationController = Ember.Controller.extend({
  currentPathChanged: function() {
    App.set('currentPath', this.get('currentPath'));
  }.observes('currentPath')
});

然后从你的ajax回调中你可以这样做以获得当前路线:

App.get('currentPath');

希望它有所帮助。