0

を使ってフォームを書いていZend_Dojo_Formます。

要素をフォームに動的に挿入しない限り、すべてうまくいきます (ajax を使用すると、ユーザーは [+] ボタンをクリックして要素を追加できます)。

ページに新しい要素を挿入することはできZend_Dojo_Form_Element_FilteringSelectましたが、要素は 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 に答える