2010-07-09 5 views
6

En ExtJs je voudrais obtenir l'équivalent de:Ext Js bouton radio avec le texte d'entrée dans l'étiquette

<input type="radio"><label><input type="text"></label> 

Lorsque la case d'entrée est associée au bouton radio.

new Ext.form.RadioGroup({ 
         id:"alerts", 

         items: [ 
          new Ext.form.Radio({ 
           boxLabel:'Now', 

          }), 
          new Ext.form.Radio({ 
           boxLabel:'On', 
          }) 

         ] 
); 

je voudrais « On » l'étiquette d'avoir un Ext.form.TextField à côté.

J'ai essayé d'ajouter un Ext.form.TextField au RadioGroup mais il ne s'affichera pas (comme je le suppose parce que ce n'est pas une Radio) et je ne peux pas ajouter d'éléments à l'objet Radio.

Un conseil apprecaited, merci.

Répondre

0

Je ne pense pas que ce soit possible à moins de surcharger la classe RadioButton et de changer sa logique de rendu (et je pense que ce serait plus complexe que de faire un textfield correctement comme vous l'avez proposé). Une meilleure approche consisterait simplement à ajouter la radio et le champ de texte en tant que deux champs séparés et à les lier par programmation. Dans Ext 3.2 vous pouvez utiliser un CompositeField pour le faire facilement. Dans le gestionnaire de la radio fn, vous pouvez définir la zone de texte associée ou toute autre logique dont vous avez besoin.

2

Ajouter un élément <input/> dans le boxLabel, puis sur l'événement render RadioGroup créer un TextField et l'appliquer à cet élément

new Ext.form.RadioGroup({ 
    id:"alerts", 
    items: [ 
    {boxLabel: 'Now',}, 
    {boxLabel: 'On <input id="on_date" type="text"/>'}, // contains <input/> id is "on_date" 
    ], 
    listeners: { 
    change: function() { 
     // really, check if "on" was clicked 
     if(true) { 
     Ext.getCmp('on_date_field').focus(); 
     } else { 
     // otherwise, disable the field? 
     } 
    }, 
    render: function() { 
     new Ext.form.TextField({ 
     id: 'on_date_field', 
     applyTo: 'on_date', // apply textfield to element whose id is "on_date" 
     }); 
    } 
    } 
}); 

J'ai confirmé que cela fonctionne avec TextField, et bien que je n'ai pas essayé, il devrait fonctionner avec DateField ou ComboBox aussi. Également non testé, mais au lieu de créer un <input/>, vous pouvez créer un élément conteneur et créer le TextField et renderTo cet élément.

+0

Dans quels navigateurs avez-vous testé cela? Dans Firefox, l'élément radio vole le focus du champ de texte et ne permet pas de taper dedans (jusqu'à ce que vous enleviez la radio). Dans IE, vous obtenez "fieldLabel est null ou pas un objet". Je ne sais pas si vous êtes celui qui a voté ma réponse vers le bas, mais je ne dis pas qu'il ne serait pas possible de le faire, je l'ai dit que ce serait plus complexe que vous pourriez penser. Je pense que cette réponse prouve mon point de vue. –

+0

Je l'ai essayé dans Firefox 3.6. Le vol de focus est dû au fait que l'étiquette est cliquée et qu'il y a un gestionnaire sur RadioGroup qui tente d'intercepter les clics sur les étiquettes. J'ai édité la réponse pour la faire fonctionner correctement. Je vous ai voté, désolé je suis nouveau à SO, je ne comprends pas si cela a un grand impact ou non, je pensais que j'étais juste en désaccord avec votre réponse. J'ai essayé de le reprendre, mais il ne m'a pas laissé. –

+0

Il n'y a pas de « règle », mais depuis le bas vote enlève effectivement la réputation de la personne que vous downvote, le but est normalement indiquer une réponse est hors-sujet ou est trompeur activement. Habituellement, quand quelqu'un essaie légitimement d'offrir de l'aide, même si ce n'est pas une réponse qui vous semble la meilleure, ce n'est pas vraiment une raison de la déprécier (plutôt que de commenter pourquoi vous pensez que la réponse n'est pas la meilleure. celui-là). Peut-être une autre personne sympathique viendra-et votez-moi pour l'appeler même ... :) –