2010-06-30 8 views
1

J'essaie d'ajouter dynamiquement un nouveau widget FilteringSelect à un formulaire préexistant que j'ai créé à partir de balises déclaratives (au chargement de la page).Comment ajouter dynamiquement un widget Dijit à un formulaire Dojo?

prereqs = 0; 
function addAnotherPrerequisite(){ 

    var newPreReqCursor = dijit.byId("Prerequisite"+(prereqs-1)).domNode; 
    dojo.create("input",{ 
     id:"prerequisite"+prereqs, 
     jsId:"Prerequisite"+prereqs,       
     dojoType:"dijit.form.FilteringSelect", 
     store:"PrerequisitesStore", 
     searchAttr:"name", 
     style:"width: 350px;", 
     required:"true", 
     class: "appendedPreReq"},newPreReqCursor,"after"); 


    dojo.parser.parse(newPreReqCursor.parentNode); 

    prereqs++; 
} 

Ce code génère correctement un widget FilteringSelect, mais le widget ne semble pas être enregistré avec le formulaire. Chaque fois que je soumets le formulaire, aucune des valeurs dans les nouveaux widgets n'apparaît. L'attribut de validation fonctionne, cependant, et il tire correctement les valeurs du magasin. Je peux même appeler le nouveau widget via son jsId (Prerequisite1, Prerequisite2, etc) Il ne sera tout simplement pas POST!

Au lieu de dojo.create, j'ai également essayé d'appeler le widget FilteringSelect directement. Cela a également fait le widget, mais n'a pas enregistré les valeurs avec le formulaire lors du POSTing.

var filteringSelect = new dijit.form.FilteringSelect({ 
     id: "prereq"+prereqs, 
     jsId: "Prerequisite"+prereqs, 
     store: PrerequisitesStore, 
     searchAttr: "name", 
     required: true, 
     style: 'width: 350px;', 
     class: 'appendedPreReq' 
    }, 
    "prerequisite"+prereqs).startup(); 

Je deviens fou en essayant de comprendre cela.

Répondre

1

il semble donc comme il y a une sorte de bug ou quelque chose. J'ai dû définir explicitement l'attribut 'name' pour que le widget apparaisse dans la méthode .getDependents() de mon formulaire. C'est ainsi que dijit.forms obtient sa liste de valeurs de formulaire. Après avoir fait cela, je ne pouvais pas non plus accéder à ce widget par dijit.byId (je n'ai rien retourné, j'ai attrapé l'erreur en silence), donc j'ai renvoyé l'objet via son jsId avec un eval.

prereqs = 0; 
function(){ 
    var newPreReqCursor = eval("Prerequisite"+(prereqs-1)); 
    newPreReqCursor = newPreReqCursor.domNode; 

    dojo.create("input",{ 
      id:"Prerequisite"+prereqs, 
      name:"Prerequisite"+prereqs, 
      jsId:"Prerequisite"+prereqs, 
      dojoType:"dijit.form.FilteringSelect", 
      store:"PrerequisitesStore", 
      searchAttr:"name", 
      style:"width: 350px;", 
      required:"true", 
      class: "appendedPreReq"},newPreReqCursor,"after"); 

    var filterSelect = dojo.parser.parse(newPreReqCursor.parentNode); 
} 
+0

C'était utile. J'ai trouvé que tout ce qui était requis était de spécifier le nom dans ma situation: 'new dijit.form.TextBox ({name: inputNode.name}, inputNode);' – Chris

0

C'est très facile. Il suffit de créer un nouvel objet comme ça:

// first let's create an empty node (you can reuse the existing one) 
var node = dojo.create("div", { 
    // all necessary node attributes 
    className: "appendedPreReq", 
    style: { 
    width: "350px" 
    } 
}, "myAnchorNodeId", "after"); 

// now let's create a widget 
var widget = new dijit.form.FilteringSelect(
    { 
    // all necessary widget properties 
    id: "prereq" + prereqs, 
    store: PrerequisitesStore, 
    searchAttr: "name", 
    required: true 
    }, 
    node // optional node to replace with the widget 
); 

À lire:

+0

C'était mon intention initiale. Je n'ai pas inclus le script dojo.create de ma tentative d'instancier dijit.form.FilteringSelect. J'ai effectivement répondu à ma propre question (ressemble à un bug). Merci pour l'aide en tout cas. : D –

0

oui tout en créant des widgets comme l'a dit Eugene Lazutkin le type d'entrée larvé avec le filtrage sélectionnez obtient le nom comme de l'identifiant, ainsi que la valeur du champ caché est mise à jour correctement. Mais quand la sélection de filtrage est créée par la méthode .create() nous devons donner le nom, et aussi la valeur du champ caché ne se met pas à jour après que nous ayons sélectionné certaines valeurs de la sélection de filtrage (même quand nous sommes brouillés). Eugene Lazutkin pouvez-vous me dire pourquoi cela se passe donc ... comment mettre à jour la valeur du champ caché dans la méthode .create().

Questions connexes