8

注: 私は JavaScript に関してまったく無知です。

ExtJS 4.1 MVC アプリを次のようないくつかのコントローラーに分割しました。

/app/controller/Auth
    |          |Quiz
    |          |Result
    |          |Blah...
    |model/...

myとcontrollerの両方で関数を呼び出して、 DOM Eventではなく「イベント」に応答したい。最初の部分の要約コードは次のとおりです。Ext.form.action.Submit.successAuthQuiz

// File: app/controller/Auth.js
attemptLogin : function() {
    var form = Ext.ComponentQuery.query('#loginpanel')[0].form;
    if (form.isValid()) {
        form.submit({
        success : function(form, action) {
            // THIS IS THE FUNCTION FROM THE CURRENT CONTROLLER
            Assessor.controller.Auth.prototype.finishLogin();
            // THIS IS THE FUNCTION FROM THE OTHER CONTROLLER
            Assessor.controller.Quiz.prototype.setupAssessment();
        },

これは機能しますが、気分が悪いです。これを行う適切な方法はありますか?両方のコントローラーがリッスンする固有のイベントを発生させる必要があるようですが、 でそれを行う方法がわかりませんExt.Event。ガイダンスはありますか?

ありがとう!素晴らしいアイデアとアドバイスをいただき、本当に感謝しています。

4

5 に答える 5

6

ここで言ったように、フォームからカスタムイベントを発生させ、両方のコントローラーでそれを聞くだけでいいのです。

両方のコントローラーがリッスンする一意のイベントを発生させる必要があるようです

// File: app/controller/Auth.js
attemptLogin : function() {
    var form = Ext.ComponentQuery.down('#loginpanel').form;
    if (form.isValid()) {
        form.submit({
        success : function(form, action) {
            // fire the event from the form panel
            form.owner.fireEvent('loginsuccess', form.owner);
        },

次に、各コントローラーで、次のように Controller#control でリッスンできます。

Ext.define('YourApp.controller.Auth', {
    extend: 'Ext.app.Controller',

    init: function() {
        var me = this; 

        me.control({

            '#loginpanel': {

                loginsuccess: me.someHandler

            }
        });
    },

    someHandler: function(form) {
        //whatever needs to be done
        console.log(form);
    }
}

そして、同じものをQuizコントローラーに追加します。

Ext.define('YourApp.controller.Quiz', {
    extend: 'Ext.app.Controller',

    init: function() {
        var me = this; 

        me.control({

            '#loginpanel': {

                loginsuccess: me.someOtherHandler

            }
        });
    },

    someOtherHandler: function(form) {
        //whatever needs to be done
        console.log(form);
    }
}

私はこのアプローチを 4.1.0 と 4.1.1 でうまく使いました

于 2012-08-22T04:18:03.543 に答える
3

本当はこうあるべき

Assessor.controller.Auth.prototype.finishLogin.apply(this, arguments)

またはこれらの行に沿ったもの(thisメソッドの「所有者」であるコントローラーオブジェクトを指す正しい参照を取得するため)

しかし、なぜこの非正統的な方法を使用して現在のコントローラーのメソッドを呼び出すのでしょうか。scope成功のコールバックを設定してから、this.finishLogin() を呼び出します。

form.submit({
    success : function(form, action) {
        // THIS IS THE FUNCTION FROM THE CURRENT CONTROLLER
        this.finishLogin();
        ...
    },
    scope: this
});

また、 を使用して別のコントローラー インスタンスを取得することもできますController#getController

this.getController('Assessor.controller.quiz').setupAssignment();

次に、コントローラーのメソッドが互いに依存していない場合は、両方に同じイベントをリッスンさせることができます。

もう 1 つの解決策は、ログインが完了したらカスタム イベントを発生させることです。アプリケーションオブジェクトでそれを行うことができます

this.application.fireEvent('logincomplete');

そしてコントローラーのinitメソッドで:

this.application.mon('logincomplete', this.setupAssignment, this);

経由でこれらのイベントを聞くことはできないことに注意してくださいController#control- これを実現するための Ext へのパッチについては、Alexander Tokarev のブログ投稿を参照してください。

于 2012-08-22T04:04:55.217 に答える
2

コントローラー間でイベントを発生させる標準的な方法はありませんが、いくつかのカスタム ハックで可能です。最近のブログ投稿を参照してください。

于 2012-08-22T03:38:24.243 に答える
0

私もこれを探していましたが、必要なのは Asanda.app.getController('quiz').setupAssignment(); だけです。ここで、Asanda はアプリの名前です

于 2015-10-07T08:47:28.620 に答える