dojox/form/Manager onSubmit срабатывает более одного раза

Я объявил класс на основе dgrid/OnDemandGrid. Класс может отображать выбранную запись для редактирования с помощью dojox/form/Manager, которую я поместил в dijit/Dialog. При редактировании первой записи все работает нормально, но последующие отправки, похоже, накапливаются и повторно запускают событие отправки, хотя метод put вызывается только один раз для каждой отправки.

См. выходные данные Firebug здесь http://speedyshare.com/hQBuP/submitRecord.png (просто нажмите на название файла вверху)

Методы редактирования и отправки выглядят так, как показано ниже. Любые предложения о том, что не так с моим кодом, приветствуются.

Заранее спасибо.

editRecord: function() {
    this.editMode = "edit";

    var rec = this.store.get(currentRowId);
    var form = registry.byId(this.editFormId);
    var dialog = registry.byId(this.dialogId);

    form.reset();
    form.setFormValues(rec);
    form.on("submit", lang.hitch(this, this.submitRecord));

    var cancelButton = registry.byId(this.cancelButtonId);
    dialog.show().then(function(){cancelButton.focus();});
},

submitRecord: function(event) {
    // Testing counter
    if(!this.counter)
        this.counter = 1;
    else
        this.counter++;
    console.log("Submit event: " + this.counter);

    // Get form, dialog and retrieve record
    var form = registry.byId(this.editFormId);
    var dialog = registry.byId(this.dialogId);

    // Check validity
    if(!form.validate()) {
            return false;
    }

    var rec = form.gatherFormValues();

    // Put record in store  
    this.store.put(rec).then( /*..... pop up status or error toaster (code omitted)..*/ );

    // Dismiss dialog
    form.reset();
    dialog.hide();

    // Stop submit event
    event.stopPropagation();
    event.preventDefault();    
    return false;
}

person danishrulez    schedule 20.02.2014    source источник


Ответы (1)


Вы подключаете прослушиватель событий submit каждый раз, когда вызывается editRecord, что, по-видимому, происходит каждый раз, когда вы показываете свой диалог. Вы действительно хотите подключить этого слушателя только один раз. Поскольку вы никогда не удаляете его и не добавляете каждый раз, вы фактически заставляете одну и ту же функцию запускаться n+1 раз при следующей отправке после каждого вызова editRecord. Вместо этого подключите обработчик события отправки ровно один раз после создания формы.

Если бы мне пришлось угадывать, причина, по которой store.put вызывается только один раз, заключается в том, что после этого вы сбрасываете форму, поэтому последующие повторяющиеся вызовы submitRecord завершатся ошибкой вызова validate и отключатся перед вызовом put.

person Ken Franqueiro    schedule 21.02.2014