Forms 如何将Dijit小部件动态添加到Dojo表单?

Forms 如何将Dijit小部件动态添加到Dojo表单?,forms,post,widget,dojo,Forms,Post,Widget,Dojo,我正在尝试将一个新的FilteringSelect小部件动态地添加到一个由声明性标记(在页面加载时)组成的预先存在的表单中 这段代码正确地构建了FilteringSelect小部件,但该小部件似乎没有在表单中注册。每当我提交表单时,新窗口小部件中的值都不会出现。不过,validation属性可以正常工作,它可以正确地从存储中提取值。我甚至可以通过它的jsId(Prerequisite1、Prerequisite2等)调用新的小部件,它只是不会发布 我还尝试直接调用FilteringSelect小

我正在尝试将一个新的FilteringSelect小部件动态地添加到一个由声明性标记(在页面加载时)组成的预先存在的表单中

这段代码正确地构建了FilteringSelect小部件,但该小部件似乎没有在表单中注册。每当我提交表单时,新窗口小部件中的值都不会出现。不过,validation属性可以正常工作,它可以正确地从存储中提取值。我甚至可以通过它的jsId(Prerequisite1、Prerequisite2等)调用新的小部件,它只是不会发布

我还尝试直接调用FilteringSelect小部件,而不是dojo.create。这也会创建小部件,但在发布期间没有将值注册到表单中

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

想弄明白这一点我快发疯了。

这很容易。只需创建一个新对象,如下所示:

// 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
);
阅读所有关于它的信息:


所以看起来好像有什么bug之类的东西。我必须显式定义“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 );
}

是的,正如Eugene Lazutkin所说,在创建小部件时,与筛选选择相关的输入类型hidden将获得id的名称,并且隐藏字段的值正在正确更新。但是,当筛选选择被创建时,我们需要给出名称,并且在我们从筛选选择中选择一些值后,隐藏字段的值也不会更新(即使在模糊时)。尤金·拉祖特金你能告诉我为什么会发生这样。。。如何更新.create()方法中隐藏字段的值。

这是我最初的意图。我在实例化dijit.form.FilteringSelect时没有包含dojo.create脚本。我已经回答了我自己的问题(看起来像个bug)。不过,谢谢你的帮助这很有帮助。我发现所需要的只是在我的情况下指定名称:
new dijit.form.TextBox({name:inputNode.name},inputNode)
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 );
}