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

时间:2010-06-30 08:35:14

标签: forms post widget dojo

我正在尝试将一个新的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小部件,但小部件似乎未在表单中注册。每当我提交表单时,新窗口小部件中都不会出现任何值。但验证属性是有效的,并且它正确地从商店中提取值。我甚至可以通过其jsId(Prerequisite1,Prerequisite2等)调用新的小部件。它只是不会POST!

我还尝试直接调用FilteringSelect小部件而不是dojo.create。这也创建了小部件,但是在POST期间没有使用表单注册值。

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 个答案:

答案 0 :(得分:1)

所以看起来有某种bug或者某种东西。我必须明确定义'name'属性,以使窗口小部件显示在我的窗体的.getDependents()方法中。这就是dijit.forms获取其表单值列表的方式。执行此操作后,我也无法通过dijit.byId访问此窗口小部件(没有返回任何内容,默默地捕获了我猜的错误),所以我通过其带有eval的jsId返回了该对象。

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

答案 1 :(得分: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
);

阅读所有相关内容:

答案 2 :(得分:0)

是的,在创建小部件时,如Eugene Lazutkin所说,与过滤选择相关的隐藏输入类型获取id的名称,并且隐藏字段的值也正确更新。但是当创建过滤选择thr .create()方法时我们需要给出名称,并且在我们从过滤选择中选择一些值之后,隐藏字段的值也不会更新(即使我们模糊了)。 Eugene Lazutkin你可以让我知道为什么会发生这种情况......如何在.create()方法中更新隐藏字段的值。