代码之家  ›  专栏  ›  技术社区  ›  Will Olbrys

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

  •  2
  • Will Olbrys  · 技术社区  · 16 年前

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

    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小部件,但是这个小部件似乎没有在表单中注册。每当我提交表单时,新窗口小部件中的值都不会出现。不过,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();
    

    我要疯了,想弄清楚这个。

    3 回复  |  直到 16 年前
        1
  •  1
  •   Will Olbrys    16 年前

    看起来好像有什么虫子什么的。我必须显式定义'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 );
    }
    
        2
  •  0
  •   Eugene Lazutkin    16 年前

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

    阅读全部内容:

        3
  •  0
  •   Rajkamal Subramanian    15 年前

    是的,正如eugenelazutkin所说,在创建widget时,与筛选select相关的input type hidden将获得id的名称,并且隐藏字段的值正在正确更新。但是在创建筛选选择thr.create()方法时,我们需要给出名称,而且在我们从筛选选择中选择一些值之后,隐藏字段的值也不会更新(即使我们模糊了)。尤金·拉祖金,你能告诉我为什么会这样。。。如何更新.create()方法中隐藏字段的值。