2013-02-13 64 views
1

我想重写一个正在工作的PHP函数到javascript中,因为我需要在浏览器端执行这些工作,并将事件处理程序添加到希望添加到我的页面的对象中。递归js函数没有settimeout

该函数需要一个包含父子关系的节点数组,查看节点,然后查看其子节点,然后查看子节点的子节点等(直到找到树的末尾)。

工作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函数的结果看起来像: 甲

-C

-D

- E

˚F

这是我曾尝试编写JavaScript,但我怀疑调用该函数show_child_nodes形成内的功能是不正确的JS ......

功能正确地产生第一个节点,但一旦它试图分析一个子节点就停下来,因此我怀疑函数内部的调用是问题。

javascript正在从php脚本接收json数组,它包含节点(任务)及其详细信息列表,以及结构化的order_index数组[parent_id1 => array [1,2,3],parent_id2 => [4,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); 
      }); 

    }); 
+0

您可以添加设置代码'order_index'和'tasks'? – ThinkingStiff 2013-02-13 06:33:15

+0

编辑,谢谢你回到我身边,已包括所有的JavaScript和解释它的处理...希望这可以使它更清晰 – 2013-02-13 06:50:44

+1

最好有例子数据来运行代码,例如,从PHP逐字输出。 – 2013-02-13 06:52:29

回答

0

这似乎解决它。

演示:jsFiddle

改变这一行:

if(order_index[order_index[parent_id]]) 

到:

if(order_index[parent_id]) 
+0

哇!完全修复它。谢谢! – 2013-02-13 07:11:43

0

我看不出有什么毛病在algorith M本身,但下面的部分很可能是一个问题:

$.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]) 
+0

啊,我看到你 - 你的好位置,会调整!谢谢! – 2013-02-13 07:21:39