ExtJS - сохранение данных в нескольких магазинах - PullRequest
4 голосов
/ 12 августа 2010

У меня есть три магазина (Ext.data.JsonStore) внутри подкласса Ext.Window.Я хотел бы вызвать save() для всех них, отобразить маску ожидания до завершения, а затем закрыть окно или обработать ошибку.

Есть ли способ, которым я могу сделать это, не заканчивая чем-то действительно грязным?Я подумывал сделать это, вызвав save() во втором хранилище из события save в первом и т. Д., А затем скомбинировать что-нибудь вместе, чтобы я мог установить обратный вызов, который будет вызван, когда последний магазин закончит сохранение,похоже, у меня получится большой вложенный беспорядок.Так что любые предложения о том, как построить это чисто, будут с благодарностью.

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Что-то вроде:

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

Извините, нет времени для тестирования - но алгоритм может быть там.

0 голосов
/ 13 августа 2010

Я закончил тем, что использовал что-то вроде предложенного Дразиллом, но это стало немного грязным. Я полагаю, что это облажалось бы, если бы вы звонили дважды, не дожидаясь окончания первого раза, из-за того, как работают события.

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();
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...