2

2 つのタブを持つタブ コントロールを含むビューがあります。各タブのエイリアスを次の形式で定義しました。

alias: 'widget.contenttab'

コントローラーで「contenttab」にアクセスしようとしていますが、定義されていないと表示されます。

contenttab is not defined

コントローラーの選択ハンドラーでタブのhtmlコンテンツを設定しようとしています:

Ext.define('BP.controller.Induction', {
extend: 'Ext.app.Controller',

views: [
    'induction.Binder',
    'induction.LeftPage',
    'induction.RightPage',
],

stores: [
    'Sections',
    'Categories',
    'Tasks'
],

models: [
    'Section',
    'Category',
    'Task'
],


init: function() {
    this.control({
        'grid[xtype=categorygrid]': {
            itemclick: this.onItemClick 
        }
    });
    console.log('Initialized Induction!');
},


onItemClick: function(e, d) {
    console.log(d.data.category_id);
    this.getCategoriesStore().load({params:{'id':d.data.category_id}}, {
        success: function(category) {
            console.log("Category: " + category.get('name'));
        },
        error: function(e) {
            console.log(e);
        }
    });
    contenttab.html = 'test'; // produces error

}
});

「contenttab」は、RightPage ビュー内にあります。エラーを生成する行は、最終的に成功コールバック関数内に存在する必要があります-しかし、これは起動されていません(Extjsストアロード成功ハンドラーが起動されないという問題について、ここで別の質問を作成しました

ご指導ありがとうございます。

4

2 に答える 2

5

あなたの場合、ComponentQueryを使用してタブインスタンスを受け取る必要があります。少なくともタブの名前を知っているので、できると思います

var single = Ext.ComponentQuery.query('contenttab[title=YourTabName]')[0];

または、そのタイプのすべてのタブが必要な場合。

var list = Ext.ComponentQuery.query('contenttab');

結果は常に配列になるため、最初の例では配列セレクターを使用しました。インスタンスを取得するためにいつでもこれを行うことができます。ただし、同じインスタンスに対してこれを頻繁に行うほど、インスタンスをローカル変数として保存することをお勧めします。特に、ループ内でそれに向かう途中の場合。

これはコントローラー内のrefプロパティでもあり、いくつかのことを自動的に行います。いくつかの例:

refs: [
        {
            ref: 'firstTab',
            selector: 'contenttab[title=YourTabName]'
        }
    ]

getFirstTab()これにより、(提供されたクエリに基づいて)タブを参照する(auto camel-caseに注意してください)という名前のメソッドが作成されます。のようなオプションが他にもあることに注意してくださいautocreate。私はこれを使用したことはありませんが、起動時に役立つ可能性のあるいくつかのことをまとめています.

前の質問の最後のコメントに答えるには: はい、これが正しい方法です。

于 2012-11-13T07:07:50.570 に答える
2

エイリアスを指定すると、Ext.widget('contenttab')メソッドでエイリアスを使用して、コンポーネントのインスタンスを作成できます。ただし、グローバル変数'contenttab'は作成されません。

もう1つは、コンポーネントマネージャの「contenttab」名の下に「xtype」を登録します。次のようにxtypeでコンポーネントを参照できるようにします

...
items:[ 'contenttab' ],
....

エイリアスのドキュメント:http://docs.sencha.com/ext-js/4-1/#! / api / Ext.Class-cfg-alias およびその他の例:http: //docs.sencha.com/ext -js / 4-1 /#!/ guide / application_architecture

于 2012-11-12T23:58:34.387 に答える