ExtJS 4.1从另一个调用一个控制器

jus*_*ane 8 events controller extjs

注意:关于javascript,我总是无知.

我已经将我的ExtJS 4.1 MVC应用程序分成几个控制器,如:

/app/controller/Auth
    |          |Quiz
    |          |Result
    |          |Blah...
    |model/...
Run Code Online (Sandbox Code Playgroud)

我想以一个"事件",而不是一个回应DOM事件,而是一个Ext.form.action.Submit.success通过调用函数事件AuthQuiz控制器.第一部分的汇总代码如下:

// 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();
        },
Run Code Online (Sandbox Code Playgroud)

这有效,但感觉不对.有没有正确的方法来做到这一点?看起来我应该触发一个由两个控制器监听的独特事件,但我无法理解如何使用它Ext.Event.任何指导?

谢谢!我真的很感谢所有伟大的想法和建议.

Aci*_*ier 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);
        },
Run Code Online (Sandbox Code Playgroud)

然后在每个控制器中,您可以使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将相同的内容添加到您的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在4.1.0和4.1.1中成功使用了这种方法