javascript - 在 emberjs 中重新加载当前路由

标签 javascript asynchronous ember.js

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

我的项目的小设置:

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 get 完成时,两个观察者都会被调用。但是,是否可以看到哪个 Controller 处于事件状态,从而只执行一个观察者?

谢谢

最佳答案

虽然我不得不承认@Marcio在他的评论中是正确的,因为 Controller 的init函数只被调用一次,但不知道你确切的用例它可能会没问题,因此这里有两种简单的方法。

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

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 Controller 的 Controller ,这种简单的方法就无法很好地扩展。

编辑以回复您的最新评论

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

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');

希望有帮助。

关于javascript - 在 emberjs 中重新加载当前路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18082131/

相关文章:

ember.js - 如何创建与 Ember.js 和 Rails 关联的belongsTo 记录?

javascript - 如何使用 lightbox-0.5 在一页中添加两个画廊

javascript - 放大弹出窗口不适用于由数据表创建的按钮

python - 如何在 Tornado 中实现可中断的 time.sleep?

AngularJS错误: regeneratorRuntime is not defined with async function

javascript - Pace和ember,如何让它在所有路线上工作而不重复代码

javascript - 什么是 JSON 安全对象?

javascript - ng-submit 不起作用

android - 在 Android 中异步发送 HTTP GET 请求的最佳方式?

jquery - 在 Ember 中保留滚动位置