1

app フォルダの外で定義されたクラスを持つ sencha touch アプリケーションを構築しています。そのクラスを動的にロードする方法です。

アプリケーションの構造は次のようになります。

assets
   -> Assignment
          -> controller
                 -> AssignmentAPI
   -> Application
          -> app
                -> controller
                     -> LoadAssignment
          -> app.js

割り当てAPI:

Ext.define('Assignment.controller.AssignmentAPI', {
          extend:'Ext.app.Controller',

              statics: {

                    getAssignments: function() {

                    }
              }
});

ロード割り当て:

 Ext.define('Application.controller.LoadAssignment', {
             extend:'Ext.app.Controller',


             requires: [
             ],

             statics: {
                    populateAssignments: function() {

                         Ext.require(['Product.controller.AssignmentAPI']);

             var assignmentAPI = Ext.ClassManager.get('Assignment.controller.AssignmentAPI');           
             //Assignment API is coming as NULL

             assignmentAPI.getAssignments()
                    }
             }  

});

app.js

 Ext.Loader.setPath({
       'Ext':      'sdk/src',
       'Assignment': '../Assignment'
  });

注*: LoadAssignment クラスの requires:[] で Task.controller.AssignmentAPI クラスを指定すると正常に動作しますが、Ext.require() を使用して Assignment.controller.AssignmentAPI をロードすると動作しません。

4

2 に答える 2

2

Ext.require() は非同期であるため、 Ext.ClassManager.get() 行に到達するまでにクラスは含まれていません。

syncRequire()を使用することもできますが、クラス定義で「requires」を使用する方がはるかに優れています。

于 2013-09-20T15:47:20.993 に答える
0

Ext.require結果は非同期の場合があります。コールバックでロジックを続行する必要があります。

Ext.require(['Audit.controller.TaskAPI'], function() {

    // Here you can be sure that the required class is available

    var taskAPI = Ext.ClassManager.get('Task.controller.TaskAPI');         
    //Task API is coming as NULL

    tasksAPI.getTasks()
});

// ... While here, you can't!
于 2013-09-20T15:44:44.163 に答える