1

フォームのビュー ファイルに設定されたフィールドに次の 2 つのコンポーネントがあります。

Ext.define('App.view.prospects.Filter', {
    alias:                             'widget.prospectsfilter',
    extend:                            'Ext.form.Panel',
    itemId:                            'prospectsfilter', 

...

initComponent:                      function(){

...

this.testButton = Ext.create('Ext.button.Button', {     
        handler:                    function() {this.fireEvent('testEvent')},
        iconCls:                   'icon-apply_16x16',
        itemId:                    'testButton',
        text:                      'Test'
    });

this.campaignsComboBox = Ext.create('Ext.form.field.ComboBox', {
        anchor:                    '100%',
        displayField:              'name',
        fieldLabel:                'Campaign(s)',
        itemId:                    'campaignsComboBox',
        labelWidth:                 90,
        listConfig:                 {
            minWidth:               150  
        },
        listeners:                  {
            select:                 function() {this.fireEvent('testEvent');}
        },
        multiSelect:                false,
        queryMode:                 'local',
        store:                      this.campaignsStore,
        value:                      null,
        valueField:                'id'
    });

さて、コントローラーには次のものがあります。

Ext.define('App.controller.ProspectsFilter', {
    extend:                            'Ext.app.Controller',    
    models:                             ['Prospect'],
    stores:                             ['Prospects'],
    views:                              ['prospects.Filter'],

...

    init:                               function() {
        this.control({
           'prospectsfilter #testButton':{
                testEvent:              function(){console.log('Found #testButton!');}
           },

           'prospectsfilter #campaignsComboBox':{
                 testEvent:              function(){console.log('Found #campaignsComboBox!');}
        }
    }
});

「testButton」をクリックすると、コンソールに見つかったというメッセージが表示されます。

しかし、 で選択してcampaignsComboBoxも何も起こりません。

なんで?

アップデート:

以下は良いテストですが、根本原因を特定できません。テストする他のコンポーネントを追加したところ、テキスト フィールドのイベントが問題なくキャプチャされました。他の人は失敗します。なんで?

更新されたコントローラーは次のとおりです。

Ext.define('MyApp.controller.ProspectsFilter', {

extend:                            'Ext.app.Controller',

models:                             ['Prospect'],
stores:                             ['Prospects'],
views:                              ['prospects.Filter'],

init:                               function() {

    this.control({
        'prospectsfilter #campaignsComboBox' : {
            render:                 this.comboRender,
            select:                 this.comboSelect
        },
        'prospectsfilter #campaignsDateField' : {
            render:                 this.dateRender,
            select:                 this.dateSelect
        },
        'prospectsfilter #campaignsTextField' : {
            render:                 this.textRender,
            change:                 this.textChange
        }
    });

},

comboRender: function(combobox)  {console.log('comboRender');}, // Never executes.
comboSelect: function(combobox)  {console.log('comboSelect');}, // Never executes.
dateRender:  function(dateField) {console.log('dateRender'); }, // Never executes.
dateSelect:  function(dateField) {console.log('dateSelect'); }, // Never executes.
textRender:  function(textField) {console.log('textRender'); }, // Executes.
textChange:  function(textField) {console.log('textChange'); }  // Executes.
});

更新されたビューは次のとおりです。

Ext.define('MyApp.view.prospects.Filter', {

alias:                             'widget.prospectsfilter',
extend:                            'Ext.form.Panel',
itemId:                            'prospectsfilter',

....

initComponent:                      function(){

    ....

    this.dateField = Ext.create('Ext.form.field.Date',{
        fieldLabel:                'Date',
        itemId:                    'campaignsDateField'
    });

    this.textField = Ext.create('Ext.form.field.Text',{
        fieldLabel:                'Text',
        itemId:                    'campaignsTextField'
    });

    this.campaignsComboBox = Ext.create('Ext.form.field.ComboBox', {
        anchor:                    '100%',
        displayField:              'name',
        fieldLabel:                'Campaign(s)',
        itemId:                    'campaignsComboBox',
        labelWidth:                 90,
        listConfig:                 {
            minWidth:               150  
        },
        multiSelect:                false,
        queryMode:                 'local',
        store:                      Ext.create('Ext.data.ArrayStore', {
            fields:                 ['name'],
            data:                   [['entry1'], ['entry2'], ['entry3']]
        }),
        tabindex:                   7,
        value:                      null,
        valueField:                'id'
    });

    this.statusToSegmentFieldSet = Ext.create('Ext.form.FieldSet', {
        anchor:                    '100%',
        autoHeight:                 true,
        collapsed:                  true,
        collapsible:                true,
        defaults:                   {
            editable:               false,
            forceSelection:         false
        },
        items:                      [                                   
            this.dateField,
            this.textField,
            this.campaignsComboBox
        ],
        layout:                    'anchor',
        margin:                    '10 10 10 10',
        title:                     'Dispositions, Campaigns, Segments'
    });

    .......

    var config = {        
        autoRender:                 true,
        autoScroll:                 true,
        bodyStyle:                 'background-color: #F1F1F1;',
        border:                     true,
        //buttons:                    [
        //    this.applyButton,
        //    this.clearButton
        //],
        collapsed:                  false,
        collapsible:                true,
        frame:                      true,
        height:                     200,
        items:                      [
            //this.datePicker,
            //this.dateRangeFieldSet,
            //this.prospectDetailsFieldSet,
            this.statusToSegmentFieldSet
            //this.assignedToFieldSet
        ],
        layout:                    'anchor',
        minWidth:                   300,
        region:                    'east',
        split:                      true,
        stateId:                   'prospectsModuleFilter',
        title:                     'Advanced Filters',
        width:                      300            
    };

    Ext.apply(this, Ext.apply(this.initialConfig, config));
    this.callParent(arguments);

}
});        

更新: 8 月 28 日:

わかった。JSFiddle で発生している問題を再現できるまで、さらに絞り込みました。

うまくいけば、これにより、誰かが何が間違っているのかを理解するのを非常に簡単にしてくれるでしょう.

こちらの JSFiddle のメモをお読みください: http://jsfiddle.net/4JubT/3/

4

3 に答える 3

0

問題は、2 番目のイベント リスナーの「this」キーワードが正しく設定されていないことです。

「handler」プロパティを使用してリスナーを登録することにより、ExtJs は関数を現在のボタン オブジェクトに自動的にバインドするため、ボタン イベント リスナーは正しく機能します。

これはドキュメントが言うことExt.button.Button#scopeです:

scope : Object ハンドラーと toggleHandler が実行されるスコープ (この参照)。デフォルトはこのボタンです。

ただし、'listener' プロパティを使用してリスナーを登録する場合は、'scope' プロパティを指定する必要があります。指定しないと、'this' 参照がグローバル ウィンドウ オブジェクトを指します。

リスナー プロパティのドキュメントを参照してください。

あなたの場合、最善の方法は、次のようにリスナーを登録することです。

this.campaignsComboBox = Ext.create('Ext.form.field.ComboBox', { .. });
this.campaignComboBox.on( 'select', 
                          function() { this.fireEvent('testEvent'); }, 
                          /* 'scope' aka 'this' reference: */ this.campaignsComboBox);

アップデート

動作中の jsfiddle は次のとおりです: http://jsfiddle.net/nXSAN/

リスナーで正しい参照を取得する別の方法は、最初の関数パラメーターを使用することです。これは、実際には ComboBox オブジェクトへの参照です (selectイベントの場合)。

    function(cmp) { cmp.fireEvent('testEvent'); }

UPDATE2 Sencha (または私のプロバイダー) は Sencha の CDN に問題があるため、ここでは「オフライン」バージョンです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Extjs</title>
    <link rel="stylesheet" type="text/css" href="extjs-4.1.1/resources/css/ext-all.css"/>
    <script type="text/javascript" src="extjs-4.1.1/ext-all.js"></script>
    <script type="text/javascript">
        Ext.define('App.view.prospects.Filter', {
            alias: 'widget.prospectsfilter',
            extend: 'Ext.form.Panel',
            itemId: 'prospectsfilter',

            height: 50,
            width: 100,
            layout: 'fit',


            initComponent: function() {

                this.combo = Ext.create('Ext.form.field.ComboBox', {
                    itemId: 'campaignsComboBox',
                    text: 'Test',

                    queryMode: 'local',
                    displayField: 'name',
                    valueField: 'name',

                    store: Ext.create('Ext.data.ArrayStore', {
                        fields: ['name'],
                        data: [ ['entry1'], ['entry2'], ['entry3'] ]
                    }),

                    listeners: {
                        select: function() {
                            this.fireEvent('testEvent')
                        }
                    }
                });

                this.items = [
                    this.combo
                ];

                this.callParent(arguments);
            }
        });

        Ext.define('App.controller.ProspectsFilter', {
            extend: 'Ext.app.Controller',

            init: function() {
                this.control({
                    'prospectsfilter #campaignsComboBox': {
                        'testEvent': function() {
                            console.log('Found #campaignsComboBox!');
                        }
                    }
                });
            }
        });

        Ext.application({
            name: 'App',
            autoCreateViewport: false,
            launch: function() {
                Ext.create('App.view.prospects.Filter', { renderTo: Ext.getBody() });
                var controller = Ext.create('App.controller.ProspectsFilter', { application: this });
                controller.init(this);
            }
        });
    </script>
</head>
<body></body>
</html>
于 2012-08-20T15:24:03.290 に答える
0

リスナーで「select」イベントが発生しますか? そこにログインしてみてください。

それに加えて、なぜカスタム イベントを発生させるのですか? コントローラーで選択イベントを直接聞くことができます。

編集 プロジェクトの 1 つを見たところ、select イベントを使用しています。そのため、カスタム イベントを発生させる最初のリスナーにログインしてみてください。

于 2012-08-20T14:42:41.573 に答える
0

EDIT : あなたは正しい # も itemId 属性に起因する可能性があります-私はそれを知りませんでしたので、ありがとう! はい、ID プロパティの使用はお勧めしません。

だから私はあなたのコンボボックスを取り、それを私のjsfiddleの例に入れ、正しく動作させました. コードに問題はないと思いますが、古いバージョンのライブラリを使用している可能性がありますか? 見てみましょう: http://jsfiddle.net/dbrin/etxwP/ 作成ボタンをクリックしてフォームを表示します - 申し訳ありませんが古い例です。

EDIT 2: http://jsfiddle.net/dbrin/4JubT/6/依存関係の問題があり、すべてのクラスで ext-all を使用できません。

于 2012-08-20T21:59:49.347 に答える