2

コントローラー内のビュー起動イベントに応答しようとしています。イベントは発生しますが、コントローラー アクションは呼び出されません。

ビュー:

Ext.define("MyApp.view.Dashboard", {
    extend: 'Ext.Container',
    xtype: 'my_dashboard',
    config: {
        items: [
            {
                xtype: 'dataview',
                listeners: {
                    itemtap: function(sender, index, elem, record) {
                        // fires with param, e.g. 'inbox'
                        this.fireEvent(record.get('name'));
                    }
                }
            }
            ...

コントローラー

Ext.define('MyApp.controller.Dashboard', {
    extend: 'Ext.app.Controller',
    config: {
        control: {
            'my_dashboard': {
                'inbox': 'showInbox',
                ...
            }
        }
    },

    showInbox: function () {
        /* never gets called */
    },

    ...

私は何を間違っていますか?

更新

解決策を見つけましたが、非常にハッキリしています。bubbleEventsデータビュービューに構成を追加すると、my_dashboardイベントがコントローラーに到達し始めました。

ダッシュボードにはさまざまな数のアイテムを含めることができるため、どのイベントをバブルアップする必要があるかわかりません。もちろん、考えられるすべてのダッシュボード イベントをバブルアップすることもできますが、それは非常に面倒なことのように思えます。

ビューは代わりにアプリケーション イベントを起動する必要がありますMyApp.app.fireEvent()か?

4

2 に答える 2

0

データビューにitemIdを配置します。

itemId: 'my_dashboard_dataview'

次に、コントローラーで...

control: {
            '#my_dashboard_dataview': {
                'itemtap': 'showInbox',
                ...
            }
        }
于 2012-10-05T00:55:26.170 に答える
0

アップデート

開始するためのコードを次に示します。

コントローラ:

Ext.define('MyApp.controller.Dashboard', {
    extend: 'Ext.app.Controller',
    config: {
        control: {
            'my_dashboard': {
                painted: 'onDashboardPainted',
                inbox: 'showInbox'
            }
        }
    },

    onDashboardPainted: function(dashboard, eOpts) {
        dashboard.down('dataview').on('itemtap', function(sender, index, elem, record){ 
          dashboard.fireEvent(record.get('name'));
          //check the console to make sure you the value is: inbox
          console.log(record.get('name'));
        });
    },

    showInbox: function () {
        console.log('showInbox init');
    },

これは間違いなくスコープの問題です...コントローラーにmy_dashboardのペイントされた関数を追加します...最初の関数変数はmy_dashboardコンポーネント自体になります:

painted: function(dashboard,...

ペイントされた関数で、リスナーを動的に追加します。

dashboard.down('dataview').on(... 残りのリスナー コード ...

今、リスナーの中でdashboard.fireEvent(....);

私の携帯電話の書式設定で申し訳ありません。動作しない場合は、明日コードを投稿します

于 2012-10-05T04:11:47.547 に答える