ExtJS - 在多个商店中保存数据

时间:2010-08-12 14:03:05

标签: javascript extjs

我在Ext.data.JsonStore的子类中有三个商店(Ext.Window)。我想在所有这些上调用save(),显示等待掩码直到完成,然后关闭窗口或处理错误。

有没有办法可以做到这一点,而不会有一些非常混乱的东西?我正在考虑通过在第一个等的save()事件中调用第二个商店中的save来做这个,然后将一些东西拼凑在一起,以便我可以设置一个回调,以便在最后一个商店时调用完成保存,但这似乎我最终会有一个大的嵌套混乱。因此,非常感谢任何关于如何干净地构建这一建议的建议。

2 个答案:

答案 0 :(得分:1)

类似的东西:

var saveStores = function(stores) {

    if (stores.length === 0) {
        console.log("All stores saved");
    } else {
        var store = stores.pop();
        store.save({
            callback : function() {
               saveStores(stores);
            }
        });
    }
}

saveStores([store1, store2, store3]);

对不起,没时间测试 - 但算法可能在那里。

答案 1 :(得分:0)

我最终使用了像Drasill建议的东西,但它有点乱。我想如果你在没有等待第一次完成的情况下两次调用它就会搞砸,因为事件的运作方式。

var save_multiple_stores = function(stores, success, fail) {
    if (stores.length === 0) {
        if (success) {
            success();
        }
    } else {
        var store = stores.pop();

        var listeners = {}

        var unbind_listeners = function() {
           for (var evt in listeners) {
                store.un(evt, listeners[evt]);
           }
        }

        var onsuccess = function() {
            unbind_listeners();
            save_multiple_stores(stores, success, fail);
        }

        var onfail = function() {
            unbind_listeners();
            if (fail) {
                fail();
            }
        }

        store.on('save', onsuccess);
        listeners.save = onsuccess;
        store.on('exception', onfail);
        listeners.exception = onfail;

        var num_records = store.save();
        //save event will not fire if there are no changed records
        if (num_records <= 0) {
            onsuccess();
        }
    }
};