我正在开发一个extjs应用程序。我们有一个页面,用于查看对象的特定实例并查看和编辑它的字段。
我们正在使用refs来掌握控制器中的一些视图。
这工作正常,但我已经将控制器分成小块以使其更易于管理,并意识到我们在代码中依赖于竞争条件。
逻辑如下:
控制器加载方法创建了一些存储,这些存储使用此id触发其他信息位请求。然后它使用一些引用来获取视图,然后重新配置它们以在加载时使用存储。
如果您尝试立即调用控制器加载方法(而不是在回调中),那么它将失败 - ref方法返回undefined。
大概这是因为视图不存在......但是我们没有检查它 - 我们只是依赖于服务器响应时加载的视图,这似乎是一个灾难的处方。
那么我们怎样才能避免这种情况,并确保在尝试使用它之前加载了一个视图。
答案 0 :(得分:0)
我还没有尝试过在这里重写逻辑,但看起来afterrender
事件可能就是我想要的。
似乎等待返回商店负载和后续事件应该产生正确的结果。
这里有一个很好的小抽象可能是这样的:
yourNamespace.createWaitRunner = function (completionCallback) {
var callback = completionCallback;
var completionRecord = [];
var elements = 0;
function maybeFinish() {
var done = completionRecord.every(function (element) {
return element === true
});
if (done)
completionCallback();
}
return {
getNotifier: function (func) {
func = func || function (){};
var index = elements++;
completionRecord[index] = false;
return function () {
func(arguments);
completionRecord[index] = true;
maybeFinish();
}
}
}
};
您可以这样使用它:
//during init
//pass in the function to call when others are done
this.waiter = yourNamespace.createWaitRunner(controller.load);
//in controller
this.control({
'SomeView': {
afterrender: this.waiter.getNotifier
}
});
//when loading record(s)
Ext.ModelManager.getModel('SomeModel').load(id, {
success: this.waiter.getNotifier(function (record, request) {
//do some extra stuff if needs be
me.setRecord(record);
})
});
我还没有尝试过,所以可能不是100%,但我认为这个想法很合理