【问题标题】:Dynamically add a Dojo-enabled Element in Zend在 Zend 中动态添加启用 Dojo 的元素
【发布时间】:2012-10-06 22:48:41
【问题描述】:

我正在使用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 的不兼容,还是我遗漏了什么......

【问题讨论】:

    标签: ajax zend-framework dojo zend-form


    【解决方案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 片段将不会被再次解析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 2017-02-09
      • 2017-11-01
      相关资源
      最近更新 更多