我目前有一个 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/