2016-03-21 1 views
2

Ich habe Schaltflächen dynamisch zu einer Symbolleiste hinzugefügt und jetzt versuche ich einen Listener hinzuzufügen, der das zentrale Fenster Panel ersetzen wird. Ich habe Probleme, den Hörer im Viewcontroller anzuschließen.Ext JS Hinzufügen von Listener zur Schaltfläche dynamisch hinzugefügt

So habe ich es bisher gemacht. Kann mir jemand in die richtige Richtung weisen?

init: function() { 

    var dynamicMenu = []; 

    var me = this; 
    console.log(me); 
    console.log(this.view); 
    var myToolbar = this.view.down('toolbar'); 
    console.log(myToolbar); 

    this.getViewModel().data.mainmenuv4store.load(function (records) { 

     console.log('hit load section'); 

     Ext.each(records, function (record) { 

      //add individual button 
      var myButton = Ext.create('Ext.Button', { 
       text: record.get('text'), 
       iconCls: record.get('iconCls'), 
       iconAlign: 'left', 
       listeners: { 
        click: { 
         fn: function (event, target) { 
          me.selectMenuButton(event, target); 
         } 
        } 
       } 
      }); 

      myButton.on({ 
       click: 
      }); 

      //add button to menu array 
      dynamicMenu.push(myButton); 
     }); 

     //put this in storeLoad otherwise this section will be hit before loading everything 
     myToolbar.add(dynamicMenu); 

    }); 
}, 

selectMenuButton: function (event, target) { 

    Ext.Msg.alert('hi'); 

    var targetCmp = Ext.get(target); 
    var id = targetCmp.getAttribute('text'); 
} 

Ich änderte meinen Code in den folgenden. Habe ich das effizient eingerichtet?

Ext.define('ExtApplication1.controller.MainMenuV4ViewController', { 
extend: 'Ext.app.ViewController', 
alias: 'controller.mainmenuv4vc', 
views: [ 
    'ExtApplication1.view.main.MainMenuV4View' 
], 

init: function() { 

    var dynamicMenu = []; 

    var me = this; 
    console.log(me); 
    console.log(this.view); 
    var myToolbar = this.view.down('toolbar'); 
    console.log(myToolbar); 

    this.getViewModel().data.mainmenuv4store.load(function (records) { 

     console.log('hit load section'); 

     Ext.each(records, function (record) { 

      //add individual button 
      var myButton = Ext.create('Ext.Button', { 
       text: record.get('text'), 
       iconCls: record.get('iconCls'), 
       iconAlign: 'left', 
       handler: me.selectMenuButton, scope: me 
      }); 

      //add button to menu array 
      dynamicMenu.push(myButton); 
     }); 

     //put this in storeLoad otherwise this section will be hit before loading everything 
     myToolbar.add(dynamicMenu); 

    }); 

    //listeners: { 
    // click: 'onProjectSelect' 
    // //click: { 
    // // fn: function (event, target) { 
    // //  me.selectMenuButton(event, target); 
    // // } 
    // //} 
    //} 
}, 

selectMenuButton: function (event, target) { 

    //Ext.Msg.alert('select menu button method hit'); 

    console.log('select menu button section was hit') 
    console.log(event); 
    console.log(target); 

} 
+0

Was genau ist das Problem? Warum versuchen Sie, einen zweiten Klicklistener zu binden? –

+0

Ich habe gerade verschiedene Möglichkeiten versucht, einen Listener hinzuzufügen. Ich muss nur eins binden. Das Problem ist, ich bin nur auf der Suche nach dem richtigen Weg, um einen Listener an eine dynamische Schaltfläche zu binden, aber den Code außerhalb des Ortes der Schaltfläche zu verschieben ... nur um der Sauberkeit willen – solarissf

Antwort

1

Basierend auf Ihrem Kommentar zu der Frage, es sieht so aus, als ob Sie einen saubereren Weg, den Hörer zu etablieren wollen. Dies ist etwas sauberer:

Statt Zuhörer: {...}, verwenden

handler: Ext.Function.bind(me.selectMenuButton, me) 
+2

Oder verwenden Sie '{handler: me.selectButton, Umfang: ich} '. –

+0

danke, wo kann ich eine gute Beschreibung erhalten, wie handler oder function.bind funktioniert ... wie wusstest du, wie man diese Parameter benutzt? – solarissf

+0

Ich habe meinen Code geändert und in den ursprünglichen Post eingefügt ... habe ich es richtig gemacht? eine letzte Sache ... wie hätte ich es gewusst, den Handler so zu strukturieren, wie du es angedeutet hast? (mit me.selectButton und scope: me? – solarissf