2010-06-30 86 views
1

我试图添加一个新的FilteringSelect小部件动态地添加到一个先前存在的声明式标记(页面加载)中。如何动态地将Dijit小部件添加到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++; 
} 

此代码正确地构建了一个FilteringSelect小部件,但小部件似乎没有在表单中注册。每当我提交表单时,新窗口小部件中的值都不会出现。虽然验证属性起作用,并且它可以正确地从商店中提取值。我甚至可以通过它的jsId(Prerequisite1,Prerequisite2等)调用新的小部件。它只是不会POST!

而不是dojo.create我也试着直接调用FilteringSelect小部件。这也构成了小部件,但在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(); 

我疯了,试图弄清楚这一点。

回答

1

因此,它看起来像有某种错误或东西。我必须明确定义'name'属性才能使窗口部件显示在我的窗体的.getDependents()方法中。这就是dijit.forms如何获取表单值的列表。这样做后,我也无法通过dijit.byId访问这个小部件(没有返回任何东西,我默默地发现了错误),所以我通过它的jsId和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

这很有帮助。我发现所有需要的是在我的情况下指定名称:'new dijit.form.TextBox({name:inputNode.name},inputNode);' – Chris 2012-06-25 17:35:33

0

这很容易。只要创建一个新的对象这样的:

// 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 
); 

阅读全部内容:

+0

这是我的初衷。我没有在尝试实例化dijit.form.FilteringSelect时包含dojo.create脚本。 我已经回答了我自己的问题(看起来像一个bug)。不过,感谢您的帮助。 :D – 2010-06-30 22:25:28

0

是同时由尤金Lazutkin表示,输入型隐藏的过滤选择与将被命名为ID,并且还隐藏字段的值是否正确更新创建部件。但是当过滤select被创建thr .create()方法时,我们需要给出名称,并且在我们从过滤select中选择了一些值(即使我们模糊不清)后,隐藏字段的值也不会更新。尤金Lazutkin你可以让我知道为什么它的发生如此...如何更新.create()方法中隐藏字段的值。

相关问题