2017-10-17 2 views
1

Bonne journée à tous.EXTjs getEl() échoue avant de montrer l'élément

En EXTjs, probablement version 4.x, j'ai un menu avec quelques niveaux de sous-menus Je voudrais ajouter un attribut de données à certains de ces sous-menus et en fait je peux le faire avec pas de problèmes avec: Ext.getCmp ("notificationMenu"). getEl(). set ({"data-notifynumber": 4});

Pour tout autre élément du menu, je dois d'abord cliquer sur le menu pour afficher tout. le sous-menu et seulement à ce moment je peux utiliser la fonction getEl(), sinon cette erreur est affichée: Uncaught TypeError: Impossible de lire la propriété 'set' de undefined

Je comprends que je devrais .. . show? render? bien, "faire quelque chose" à ces sous-éléments afin de les avoir dans le dom correctement ... Je joins une partie du code:

cela fait partie du menu que je crée:

xtype: 'button', 
      id:"notificationMenu", 
      hidden: false,    
      reference: 'userType', 
      style: 'color: #ffffff;width:58px;height:58px;', 
      glyph: 0xf0f3, 
      menu:{ 
       border:0, 
       menuAlign: 'tr-br?', 
       bodyStyle: { 
        background: '#3e4752', 
       }, 
       items:[ 
       { 
        text:"TASKS", 
        disabled:true 
       }, 
       { 
        text:"Campaigns", 
        data_id:"me_campaigns", 
        glyph:0xf0c1, 
        id:"notification_me_campaigns_root", 
        hidden:true, 
        menu:{ 
         border:0, 
         menuAlign: 'tr-br?', 
         bodyStyle: { 
          background: '#3e4752', 
         }, 
         items:[ 
         { 
         text:"Approval",... 

dans cet exemple, si je fais après Render:

Ext.getCmp("notificationMenu").getEl().set({"data-notifynumber": 10}) 

mais si j'utilise

Ext.getCmp("notification_me_campaigns_root").getEl().set({"data-notifynumber": 4}) 

l'erreur ci-dessus apparaît. S'il vous plaît avez-vous des conseils? puis-je appeler un "rendu de force" en quelque sorte?

+0

Mauvaise façon de le faire. Configurez la création de l'élément afin qu'il configure l'attribut lorsqu'il est rendu. –

+0

la fonction est déjà appelée dans le gestionnaire afterRender, et l'attribut doit être défini non pendant la création mais à certains itnervals (il s'agit d'un menu de notification pour une interrogation et de temps en temps je devais changer l'attribut de ce menu –

Répondre

0

Try to use afterrender to get dom element.

ExtJs getEl() l'élément Récupère haut niveau représentant ce composant, mais lorsque le travail dom est préparé sans dom création, elle renvoie null.

J'ai créé une démo de Sencha Fiddle qui vous aidera à atteindre votre exigence/solution.

var panel = new Ext.panel.Panel({ 
      renderTo: document.body, 
      title: 'A Panel', 
      width: 200, 
      tools: [{ 
       xtype: 'button', 
       text: 'Foo', 
       menu: { 
        defaults: { 
         handler: function() { 
          Ext.Msg.alert('Successs', 'You have click on <b>data-notifynumber</> ' + this.up('menu').getEl().getAttribute('data-notifynumber')) 
         } 
        }, 
        items: [{ 
         text: 'Item 1' 
        }, { 
         text: 'Item 2', 
         menu: { 
          listeners: { 
           afterrender: function() { 
            this.getEl().set({ 
             "data-notifynumber": 20//only for example you can put as basis of your requirement 
            }); 
           } 
          }, 
          defaults: { 
           handler: function() { 
            Ext.Msg.alert('Successs', 'You have click on <b>data-notifynumber</> ' + this.up('menu').getEl().getAttribute('data-notifynumber')) 
           } 
          }, 
          items: [{ 
           text: 'Sub Item 1', 

          }, { 
           text: 'Sub Item 2' 
          }] 
         } 
        }], 
        listeners: { 
         afterrender: function() { 
          this.getEl().set({ 
           "data-notifynumber": 10//only for example you can put as basis of your requirement 
          }); 
         } 
        } 
       } 
      }] 
     }); 
+0

La fonction qui récupère les éléments est déjà tirée dans l'afterRender du contrôleur, mais je vais aussi essayer de mettre un gestionnaire afterRender dans le menu lui-même, je vous le ferai savoir. Par la façon dont le problème semble être lié au mécanisme de rendu, il semble que le menu interne ne soit rendu qu'après avoir cliqué sur l'élément de premier niveau –