在Zend中动态添加启用Dojo的元素

时间:2009-11-03 22:50:07

标签: ajax zend-framework dojo zend-form

我正在使用Zend_Dojo_Form撰写表单。

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

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

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

我尝试了什么:

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

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

我不知道我的问题是否来自与Zend,Dojo的不兼容,或者我是否遗漏了某些东西......

1 个答案:

答案 0 :(得分:1)

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

Jeremy Kendall's javascript code中,您必须在函数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);

也许还有更好的方法,但它对我有用。删除节点时,dijits have to be destroyed before,否则HTML片段将不再被解析。