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

Posted

技术标签:

【中文标题】如何将 Dijit 小部件动态添加到 Dojo 表单?【英文标题】:How do I dynamically add a Dijit widget to a Dojo form? 【发布时间】:2010-06-30 08:35:13 【问题描述】:

我正在尝试将新的 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, etc) 调用新的小部件,它只是不会发布!

我还尝试直接调用 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();

我快要疯了。

【问题讨论】:

【参考方案1】:

所以看起来有某种错误或其他东西。我必须明确定义“名称”属性才能让小部件显示在表单的 .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 );

【讨论】:

这很有帮助。我发现只需要在我的情况下指定名称:new dijit.form.TextBox(name: inputNode.name, inputNode);【参考方案2】:

这很容易。只需像这样创建一个新对象:

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

阅读所有内容:

http://docs.dojocampus.org/dijit/info http://docs.dojocampus.org/dijit/form/FilteringSelect

【讨论】:

这是我的初衷。我在实例化 dijit.form.FilteringSelect 的尝试中没有包含 dojo.create 脚本。我实际上已经回答了我自己的问题(看起来像一个错误)。不过,感谢您的帮助。 :D【参考方案3】:

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

【讨论】:

以上是关于如何将 Dijit 小部件动态添加到 Dojo 表单?的主要内容,如果未能解决你的问题,请参考以下文章

Dojo Dijit - 小部件中的小部件

如何添加 optgroup do dijit.form.Select 或其他小部件类型

dojo.dijit.Button 触发 onclick 事件两次

Dojo Validation TextArea 小部件在无效时如何突出显示?

在带有 DOJO 插件的 Struts2 应用程序中使用 dijit 小部件有啥特殊要求吗?

Dojo dijit.form.select:创建新的选择小部件后,旧小部件的选定值无法更改