2009-11-03 33 views
0

我在寫一個使用Zend_Dojo_Form的表單。除非我動態地將元素插入到表單中(使用ajax,用戶可以通過單擊[+]按鈕添加更多元素))。在Zend中動態添加一個支持Dojo的元素

我設法插入我的新Zend_Dojo_Form_Element_FilteringSelect到頁面中,但元素不是dojo啓用(沒有自動完成,或苔原樣式)。

我猜dojo會在第一次加載頁面時轉換現有的表單元素,並且在添加新節點時不再解析它們......但是我找不到如何告訴dojo有新的元素在城裏。

我已經試過什麼:

  • 一個新的元素
  • 我Dojo_Form的init添加Zend_Dojo_View_Helper_Dojo::setUseDeclarative();()方法(如看到nabble's forums
插入後執行 dojo.parser.parse();dojo.parser.parse('id_of_new_element');

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

我不知道是不是我的問題來自於與Zend,道場不兼容,或者如果我失去了一些東西......

回答

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

,並在功能removeField(更換

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

通過

// 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片段不會再被解析。