2

ExtJS4アプリケーションをモジュールに分割しようとしています。

 - app
  - store
  - controller
  - model
  - view
  - module
     - m1
         - model
         - view
         - controller
     - m2
         - model
         - ...

問題は、アプリケーションを起動してm1コントローラーの1つを初期化すると、コントローラーにthis.control()関数がないことです。

- 編集 -

コントローラフォルダ内にクラスを定義しました。

Ext.define( 'App.module.ping.controller.Ping', {
  extend: 'Ext.app.Controller',

  requires: [
     'App.module.ping.view.PingPanel'
  ],

  init: function() {
     this.control( {
        '#app.module.ping': {
           render: this.onPanelRendered
        }
     } );
  },

  onPanelRendered: function() {
     ...
  }

});

後で電話します

Ext.create('App.module.ping.controller.Ping').init();

しかし、私はこのエラーを受け取ります:

Uncaught TypeError: Cannot call method 'control' of undefined
Ext.define.control./lib/extjs-4.1.0/src/app/Controller.js:414
Ext.define.init./app/module/ping/app/controller/Ping.js:11
Ext.define.init./app/module/ping/app/Module.js:11
(anonymous function)app.js:17
(anonymous function)app.js:35

Module.jsはcreate()呼び出しを含むファイルですPing.jsはdefine()呼び出しを含むファイルです

--edit2--

病理学的例:

入力:

Ext.define( 'MyController', { 
  extend: 'Ext.app.Controller', 
  init: function() { console.log('initialized'); } 
});

出力:

function constructor() {
  return this.constructor.apply(this, arguments);
}

入力:

Ext.create('MyController');

出力:

constructor

入力:

MyController.create();

出力:

constructor

--edit3--

コントローラは、作成時に構成オブジェクトにアプリケーションオブジェクトを必要とします。アプリケーションオブジェクトは、createで手動で作成されていないすべてのコントローラーに自分自身を追加します。それはこのようなものを呼びます:

Ext.create('App.controller.Users', { application: this, ... } );

その後、アプリケーションオブジェクトを使用して、コントロール呼び出しをそのオブジェクトにリダイレクトします。

control: function ( config ) { this.application.control( config ) };

したがって、これらのコントローラーを作成するときに、それらのコントローラーにアプリケーションを自動的に追加するメカニズムを実装する予定です。

4

3 に答える 3

1

やってみました

var pingController = Application.getController('App.module.ping.controller.Ping');
pingController.init(); //or pingController.init(Application);

ここで、Applicationは、Ext.application.launch中に作成されたオブジェクトへの参照です。

var Application = {};
Ext.application({
    //all of your settings,
    launch:function(){
         Application = this;
         //other launch code
    }
}
});
于 2012-04-18T21:45:19.550 に答える
1

解決策を探してここに来る他の人に:

Uncaught TypeError: Cannot call method 'control' of undefined

一日中の欲求不満はさておき、上記の答えは私の問題を解決しませんでしたが、問題を解決した次のことを試してみました:

// app.js
Ext.application({
    ...

    launch: function(){
        var me = this;
        ...

        me.getController('ControllerName');
    }
});

// inside controller/ControllerName.js
init: function(app){
    var me = this;

    app.control({
        '#editButton': {
            click: function(){
                me.someFunction();
            }
        }
    });
},

そのアプリ変数は、質問に対して選択された回答にある「var Application = {}」と同じです。つまり、グローバルに(またはまったく)追加する必要はありませんでした。私は何百万もの異なることを試みたに違いありませんが、これはついにうまくいきました。それが他の誰かを救うことを願っています。

于 2013-10-25T16:25:06.120 に答える
0

init()を手動で呼び出す必要はありません。呼び出すだけでExt.create、コンストラクターが自動的に呼び出されます。

于 2012-04-18T10:19:08.340 に答える