0

我正在使用Zend_Dojo_Form.

一切都很好,除非我动态地将元素插入到表单中(使用 ajax,用户可以通过单击 [+] 按钮添加更多元素)。

我设法将我的新元素插入Zend_Dojo_Form_Element_FilteringSelect到页面中,但该元素没有启用 dojo(没有自动完成或 tundra 样式)。

我猜在第一次加载页面后,dojo 会转换现有的表单元素,并且在添加新节点时不会再次解析它们......但我找不到如何告诉 dojo 城里有新元素。

我试过的:

  • 执行dojo.parser.parse();dojo.parser.parse('id_of_new_element');插入新元素之后
  • 添加Zend_Dojo_View_Helper_Dojo::setUseDeclarative();我的 Dojo_Form 的 init() 方法(如nabble 的论坛所示)

我添加新元素的方法是Jeremy Kendall所描述的方法。

我不知道我的问题是来自与 Zend、Dojo 的不兼容,还是我遗漏了一些东西......

4

1 回答 1

1

经过一番摆弄,我终于设法让它运行起来。

Jeremy Kendall 的 javascript 代码中,您必须在函数 ajaxAddField()中插入以下脚本

// Insert new element before the Add button
$("#addElement-label").before(newElement);

// Parse the element to receive Dojo style
var n = dojo.byId("newName" + id);
n.outerHTML = newElement;
dojo.parser.parse(n);

并更换

searchString = '*[id^=newName' + lastId + '-]';
$(searchString).remove()

函数 removeField()

// Destroy dijits before destroying the node
var n = dojo.byId("newName" + lastId);
var dijits = dijit.findWidgets(n);
if (dijits) {
    for (var i = 0, n = dijits.length; i < n; i++) {
        dijits[i].destroyRecursive();
    }
}
dijits = dojo.parser.parse("newName" + lastId);

// Destroy the node
dojo.destroy("newName" + lastId);

也许还有更好的方法来做到这一点,但它对我有用。删除节点时,必须先销毁 dijit,否则 HTML 片段将不会再次被解析。

于 2011-01-17T15:19:06.927 回答