2010-08-07 1 views
0

J'ai une page avec une barre d'outils sur elle, qui est ajouté appliquer à travers comme si (le code abrégé, beaucoup de choses hors de propos dans l'original):ExtJS: Impossible d'appeler findById sur une barre d'outils ajoutée par apply()

var obj = Ext.extend(Ext.Panel,{ 
    initComponent:function(){ 
     Ext.apply(this,{ 
      layout:'card', 
      itemId:'contactDetails', 
      border:false, 
      activeItem:0, 
      tbar: new Ext.Toolbar({ 
       items:[{text:'New'},{text:'Edit',id:'editButton'}] 
      }) 
     }); 
     obj.superclass.initComponent.apply(this); 

    }, load:function() { 
     this.tbar.findById('editButton').toggle(false); //Javascript error here about findById not being a function. 
    } 
    }); 

Ce qui précède peut ne pas être syntaxiquement correct non plus. Il est dans mon code (au moins dans la mesure où aucune erreur javascript en dehors de la grande est jeté.)

+0

Est-il rendu au point où vous appelez la fonction de chargement? –

+0

Oui, le chargement est déclenché par un autre bouton sur la page. –

Répondre

0

Tout d'abord, vous ne devez pas surcharger initComponent juste pour fournir des configs par défaut. Cela fonctionne de la même manière et est plus simple:

var obj = Ext.extend(Ext.Panel,{ 
    layout:'card', 
    itemId:'contactDetails', 
    border:false, 
    activeItem:0, 
    tbar: new Ext.Toolbar({ 
     items:[{text:'New'},{text:'Edit',id:'editButton'}] 
    }) 
}); 

Cela pourrait aussi résoudre votre problème - puisque vous surchargez InitComponent dans votre code, (Scratch ma réponse précédente, j'ai mal lu votre code.) Vous devez appeler la classe de démarrage initComponent dans votre méthode, sinon les choses ne fonctionneront pas. Lors de la substitution InitComponent votre code, vous devez faire ceci:

initComponent: function(){ 
    Ext.apply(this,{ 
     layout:'card', 
     itemId:'contactDetails', 
     border:false, 
     activeItem:0, 
     tbar: new Ext.Toolbar({ 
      items:[{text:'New'},{text:'Edit',id:'editButton'}] 
     }) 
    }); 
    obj.superclass.initComponent.apply(this, arguments); 
} 

Aussi, êtes-vous en fait la méthode impérieuses Panel.load() existante pour une raison quelconque? Ou essayez-vous d'ajouter des fonctionnalités différentes et choisi un nom de méthode existant par erreur?

EDIT: Cela aurait dû être remarqué précédemment, mais la config n'est pas disponible après le rendu en tant que propriété valide. Dans les docs pour tbar: "Pour accéder à la barre d'outils supérieure après le rendu, utilisez getTopToolbar"

+0

Hmm ... C'est en fait du code hérité, et j'ai 0 expérience ExtJS, donc j'espérais une solution vraiment facile. Je pense, cependant, que j'ai couvert vos deux solutions simples, je les ai simplement laissées de côté. Je mettrai à jour mon post original pour refléter cela. –

+0

Oh et honnêtement, je ne sais pas ce qui se passe avec la méthode de chargement - je sais que ça ne marche pas avant d'être appelée. –

+0

Ne devriez-vous pas appeler la superclasse * après * définition du contenu avec Ext.apply? – ob1