20

私はExtJS4で何が必要かを理解しようとしてきましたが、合理的な答えを思い付くことができないようです。次のコードがあるとしましょう。

app.js

Ext.Loader.setConfig({
  enabled: true
});

Ext.Loader.setPath('Ext.ux', 'examples/ux');

Ext.application({
  name: 'Test',
  appFolder: 'app',
  controllers: ['TheController'],
  requires: ['Test.Utils', 'Test.Utils2'],  // I don't think this does anything... couldn't find this option for Ext.application
  launch: function() {
    Ext.create('Ext.Viewport', {
      layout: 'border',
      items: [{
        xtype: 'thegrid',
        region: 'center',
        title: 'blah!'
      }]
    });
  }
});

app / controller / TheController.js

Ext.define('Test.controller.TheController', {
  extend: 'Ext.app.Controller',
  models: ['TheModel'],
  stores: ['TheStore'],
  views: ['TheGrid'],
  init: function() {
  }
});

app / view / TheGrid.js

Ext.define('Test.view.TheGrid', {
  extend: 'Ext.grid.Panel',
  alias: 'widget.thegrid',
  requires: ['Test.store.TheStore'],
  store: 'TheStore',
  columns: [
    {header: 'Name', dataIndex: 'name'},
    {header: 'Phone', dataIndex: 'phone'},
    {header: 'Hello', dataIndex: 'hello'}
  ]
});

app / store / TheStore.js

Ext.define('Test.store.TheStore', {
  extend: 'Ext.data.Store',
  requires: ['Test.model.TheModel', 'Test.Utils'],
  model: 'Test.model.TheModel',
  data: [
    {name: 'keanu reeves', phone: '1800matrices', hello: Test.Utils.getText()},
    {name: 'james earl jones', phone: '1800starwar', hello: 'nothing here'},
    {name: 'barack obama', phone: '1800prsidnt', hello: 'hello world'}
  ]
});

app / model / TheModel.js

Ext.define('Test.model.TheModel', {
  extend: 'Ext.data.Model',
  fields: [
    {name: 'name', type: 'string'},
    {name: 'phone', type: 'string'},
    {name: 'hello', type: 'string'}
  ]
});

app / Utils.js

Ext.define('Test.Utils', {
  singleton: true,
  requires: ['Test.Utils2'],
  getText: function() {
    return Test.Utils2.hello + 'world';
  }
});

app / Utils2.js

Ext.define('Test.Utils2', {
  singleton: true,
  hello: 'hello'
});

これは非常に長い例だと思いますが、自分がしていることを完全に描写していることを確認する必要がありました。Utilsは、Utils2のhello変数を呼び出す必要があるため、Utils2に依存しています。残りのコードは、グリッドを設定し、TheStoreでUtils.getText関数を呼び出しています。FirebugはTest.Utils is undefinedTheStore.jsの6行目をスローします。その時点で、Test.Utilsは明らかに存在しませんが、Test.Utils2は存在します。

私の質問は...なぜUtils2は存在するのに、Utilsは存在しないのですか?必要なクラスを持ち込んで使えるようにする必要があると思ったのですが、間違っていると思います。私はSenchaのドキュメントと多数のスレッドを読みましたが、実際には何も意味がなく、この例を実際に説明していません。誰かがここでいくつかの洞察を流すことができますか?私はそれを感謝します。

**また、私はここでいくつかの馬鹿げたことをしていることに気づきましたが、それは単なる例であり、グローバルUtilsを組み合わせたり、グローバルをまったく使用したりするつもりはありません...私はただ理解しようとしています必要なオプション。

アップデート

以下のイザキの答えのおかげで、私は何かを理解しました。定義しているクラスで必要なクラスを使用する場合は、オブジェクトが作成されるのを待つ必要があるため(つまり、initComponentを使用)、ストアとグリッドコードは次のように変更されます。

app / store / TheStore.js

Ext.define('Test.store.TheStore', {
  extend: 'Ext.data.Store',
  requires: ['Test.model.TheModel'],
  model: 'Test.model.TheModel'
});

app / view / TheGrid.js

Ext.define('Test.view.TheGrid', {
  extend: 'Ext.grid.Panel',
  alias: 'widget.thegrid',
  requires: ['Test.store.TheStore'],
  store: 'TheStore',
  columns: [
    {header: 'Name', dataIndex: 'name'},
    {header: 'Phone', dataIndex: 'phone'},
    {header: 'Hello', dataIndex: 'hello'}
  ],
  // This is the change that works
  initComponent: function() {
    this.callParent();
    this.store.loadData([
      {name: 'keanu reeves', phone: '1800matrices', hello: Test.Utils.getText()},
      {name: 'james earl jones', phone: '1800starwar', hello: 'nothing here'},
      {name: 'barack obama', phone: '1800prsidnt', hello: 'hello world'}
    ]);
  }
});

これは機能しますが、私の最後の質問は... TheStoreのTheModelやTheGridのTheStoreの要件が必要ですか?TheGridでTest.Utilsを使用できるため、TheControllerがこれらすべての要件を処理しているようですが、TheGridはTest.Utilsが必要であると具体的に述べていません。

また、 Senchaドキュメントのこの例では、TheStoreが作成されるまでTest.Utilsを使用していないため、混乱が生じますが、この例では、初期化を待たずにChildクラスを使用できるようです(initComponentを使用)。 。

4

2 に答える 2

14

これは実際にはまったく馬鹿げた質問ではありません。

ExtJSに伝える方法としてrequiresを見ることができます:

「このクラスのオブジェクトを作成するときは、最初に必要なスクリプトを動的にロードしてください」。

あなたはこの行について正しいです:

requires: ['Test.Utils', 'Test.Utils2'],

で必要とされていないapp.js、理由は、アプリケーションがすでに持っているということです:

controllers: ['TheController'],

これは、常駐するjsスクリプトが必要であると言っているのと同じですTheController(モデル/ビュー/コントローラー/ストアの定義は、関連するスクリプトが必要であること、つまり動的にロードされることも意味します)。

TheControllerもっている:

requires: ['Test.model.TheModel', 'Test.Utils'],

これらを動的にロードします-これが同じrequiresものが必要ない理由app.jsです;

Firebugがスローされる理由が定義されていないのは、まだ動的にロードされていないオブジェクトへの参照を含むTest.Utilsconfig( )を指定するためです。構築されるまでスコープにはありません。helloTest.UtilsTheStore

于 2012-06-12T02:27:47.573 に答える
0
  1. HasManyの関係は、それなしでは機能しません。

  2. これは、JSBuilderがどのファイルを含めるかを知るのに役立ちます。たとえば、ビューポートが境界線レイアウトを使用している場合、それは誤って含まれず、usesを使用するか、含める必要があります。

于 2012-06-12T07:15:14.953 に答える