0

ユーザーデータが読み込まれたフォームがあります(Json Storeから)。初めてクリックすると、フォームがうまく表示されます。しかし、2回目のクラッシュ:

ここに画像の説明を入力

Firebug さんのコメント:

ここに画像の説明を入力

このフォームの後に他のフォームを表示すると、クラッシュします。何か案は ?

詳細については編集してください。フォームをロードするコードは次のとおりです。

cargarFormularioEdicion: function(idPaciente){
        var store = Ext.create('cp.store.form.Paciente',{});
        store.load({params:{idUsuario: idPaciente}});
        var form = Ext.create('cp.view.form.EditPaciente',{
            action: 'bin/paciente/modificar.php'
        });
        // Ver la forma de pasar este listener al controller
        form.on('afterrender',function(form,idPaciente){
           form.getForm().loadRecord(store.first());
           form.getForm().findField('idUsuario').setValue(idPaciente);
        });
        var win = Ext.create('cp.view.ui.DecoratorForm',{
            aTitle: 'Editar paciente',
            aForm: form
        });
        win.show();
    }

仮想的な解決策: async = false でストアをロードします。

        var store = Ext.create('cp.store.form.Paciente',{});
        Ext.apply(Ext.data.Connection.prototype, {
                async: false
        });
        store.load({params:{idUsuario: idPaciente}});
4

2 に答える 2

1

form.getForm().loadRecord(store.first());コードは、呼び出されたときにストアが読み込まれることを保証しません。おそらくそうではないため、loadRecordexpects の処理のどこかで (エラー メッセージが示すように) 未定義の変数にアクセスしようとすると、javascript の実行がクラッシュします。これにより、フォーム コンポーネントの内部状態が壊れたままになるため、そこからすべてが見苦しくなります。

ストアを同期的にロードすることで、すでにそれを発見しましたが、それは本当に避けるべきことです。スレッドをブロックして処理時間を浪費し、アプリケーションを数秒間フリーズさせる可能性があります。

非同期イベントを処理する正しい方法は、完了時にコールバックする関数を渡すことです。したがって、コールバック関数 (および「ハリウッドの原則」というジョーク) という名前が付けられました。これは効率的で安全です。

コールバック関数は複数の方法で渡すことができるため、ドキュメントを参照する必要があります。あなたのコードを例にとると、 のドキュメントを見てくださいExt.data.Store#load。コードをエレガントに修正する方法は次のとおりです。

cargarFormularioEdicion: function(idPaciente){
    var store = Ext.create('cp.store.form.Paciente');

    store.load({
        params:{idUsuario: idPaciente}

        // here's how to pass a callback to Store#load
        // notice you get access to some useful parameters as well!
        ,callback: function(records, operation, success) {
            if (!success) {
                // the execution will continue from here when the store is loaded

                var form = Ext.create('cp.view.form.EditPaciente',{
                    action: 'bin/paciente/modificar.php'
                });
                // Ver la forma de pasar este listener al controller
                form.on('afterrender',function(form,idPaciente){
                   form.getForm().loadRecord(store.first());
                   form.getForm().findField('idUsuario').setValue(idPaciente);
                });
                var win = Ext.create('cp.view.ui.DecoratorForm',{
                    aTitle: 'Editar paciente',
                    aForm: form
                });
                win.show();
            } else {
                // you need to handle that case
            }
        }
    });
}
于 2013-05-30T17:48:07.660 に答える
0

仮想的な解決策: async = false でストアをロードします。

var store = Ext.create('cp.store.form.Paciente',{});
Ext.apply(Ext.data.Connection.prototype, {
        async: false
});
store.load({params:{idUsuario: idPaciente}});
于 2013-05-30T17:02:21.023 に答える