1

ブラウザ側で作業を行い、ページに追加したいオブジェクトにイベントハンドラを追加する必要があるため、動作しているPHP関数をjavascriptに書き直そうとしています。

この関数は、親子関係を持つノードの配列を取り、ノードを調べ、次にその子、次にその子の子などを調べます (ツリーの最後が見つかるまで)。

作業中の PHP 関数:

//print nodes
function display_child_nodes($parent_id, $level) {
global $task_list, $index;
    if(isset($index[$parent_id]))
        {
            foreach ($index[$parent_id] as $id) {
                echo str_repeat("-", $level) . $task_list[$id]["title"] . "<br />";
                display_child_nodes($id, $level + 1);
            }
        }
}
display_child_nodes(0, 0);

PHP 関数の結果は次のようになります。

B

-C

-D

--え

G

これは私が書こうとした Javascript ですが、その関数内の関数 show_child_nodes フォームへの呼び出しが正しい JS ではないと思われます...

関数は最初のノードを正しく生成しますが、子ノードを分析しようとするとすぐに停止するため、関数内からの呼び出しが問題であるとの疑いがあります。

javascript は、php スクリプトから json 配列を受け取ります。これには、ノード (タスク) とその詳細のリスト、[parent_id1 => array[1,2,3]、parent_id2 => [4] 構造の order_index 配列が含まれます。 ,5]、parent_id3 => [6,7,8]] など...のように、各parent_idは値として子IDを持つキーです。

JSONは次のとおりです。

{"tasks":{"2":{"id":"2","title":"Task 2","desc":"Task 2 description","parent_id":"0"},"6":{"id":"6","title":"Task 6","desc":"Task 6 description","parent_id":"0"},"1":{"id":"1","title":"Task 1","desc":"Task 1 description","parent_id":"2"},"3":{"id":"3","title":"Task 3","desc":"Task 3 description","parent_id":"1"},"4":{"id":"4","title":"Task 4","desc":"Task 4 description","parent_id":"1"},"5":{"id":"5","title":"Task 5","desc":"Task 5 description","parent_id":"3"}},"order_index":{"0":["2","6"],"2":["1"],"1":["3","4"],"3":["5"]}}


            $.getJSON("get_items_hierarchy.php",function(data,status){

                var order_index = data.order_index;
                var tasks = data.tasks;
                var output = [];

                function show_child_nodes(parent_id,level){
                    if(order_index[order_index[parent_id]])
                        {
                            $.each(order_index[parent_id],function(index,id){
                                var margin = level * 40;
                                output.push('<div style="float: left; clear: left; margin-left: ' + margin + 'px">' + tasks[id]['title'] + '</div> ');
                                show_child_nodes(id, level + 1);
                            });
                        }
                }
                show_child_nodes(0,0);

            $.each(output,function(index,line){
                $("#tasks").append(line);
            });

    });
4

2 に答える 2

0

これで修正されるようです。

デモ: jsFiddle

この行を変更します。

if(order_index[order_index[parent_id]])

に:

if( order_index[parent_id] )
于 2013-02-13T06:35:34.913 に答える
0

アルゴリズム自体に問題はありませんが、次の部分が問題になる可能性があります。

$.each(output, function(index,line){
    $("#tasks").append(line);
});

このコードは の値を参照しますがoutput、次のようになります。

  1. $.getJSON非同期であるため、値はまだ準備ができていません。

  2. この変数は、AJAX コールバック内からのみアクセスできます。

コードは、代わりに AJAX コールバック関数の最後に配置する必要があります。

別の回答で述べたように、このステートメントはおそらく間違っています。

if (order_index[order_index[parent_id]])

単なるタイプミスかもしれませんが、おそらく正しいコードは次のとおりです。

if (order_index[parent_id])
于 2013-02-13T07:01:11.817 に答える