你怎么知道在extjs中加载视图的时候?

时间:2014-07-16 14:44:21

标签: extjs

我正在开发一个extjs应用程序。我们有一个页面,用于查看对象的特定实例并查看和编辑它的字段。

我们正在使用refs来掌握控制器中的一些视图。

这工作正常,但我已经将控制器分成小块以使其更易于管理,并意识到我们在代码中依赖于竞争条件。

逻辑如下:

  • 初始化控制器
  • 解析url以提取对象的id
  • 调用加载具有给定视图的模型。
    • 在加载回调中调用控制器加载方法......

控制器加载方法创建了一些存储,这些存储使用此id触发其他信息位请求。然后它使用一些引用来获取视图,然后重新配置它们以在加载时使用存储。

如果您尝试立即调用控制器加载方法(而不是在回调中),那么它将失败 - ref方法返回undefined。

大概这是因为视图不存在......但是我们没有检查它 - 我们只是依赖于服务器响应时加载的视图,这似乎是一个灾难的处方。

那么我们怎样才能避免这种情况,并确保在尝试使用它之前加载了一个视图。

1 个答案:

答案 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%,但我认为这个想法很合理