jQuery zTree非同期ローディング追加サブノード重複問題


zTree概要
    zTreeはjQueryによる多機能「ツリープラグイン」です。優れた性能、柔軟な配置、多機能の組み合わせがzTreeの最大の利点です。
    zTreeはオープンソース無料のソフトウェア(MITライセンス)です。zTreeに興味があるなら、またはzhTreeを援助して発展させたいなら、寄付してもいいです。
  • zTree v 3.0はコアコードを機能に従って分割しました。不要なコードは
  • をロードしなくてもいいです。
  • は遅延負荷技術を採用しています。万以上のノードは簡単にロードしています。IE 6の下でも基本的に秒殺ができます。
  • は、IE、FireFox、Chrome、Opera、Safariなどのブラウザ
  • に対応しています。
  • はJSONデータ
  • をサポートしています。
  • は、静的およびAjax非同期ローディングノードデータ
  • をサポートする。
  • 任意の皮膚の交換/カスタムアイコン(cssに依存)
  • をサポートします。
  • は極めて柔軟なcheckboxまたはradio選択機能
  • をサポートしています。
  • は、様々なイベント応答応答を提供する
  • フレキシブル編集機能(増減/削除/変更/検索)、任意にノードをドラッグしてもいいです。
  • は、一つのページ内で複数のTreeのインスタンス
  • を同時に生成することができる。
  • シンプルなパラメータ構成で、柔軟で多様な機能を実現します。
    原始的な問題
    
    //    ,      
    function addNode(event) {
      rMenu.css({ "visibility": "hidden" });
      var treeNode = zTree.getSelectedNodes()[0];
      var pid;
      var nodeName;
      var treelevel;
      if (!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) {
       //      
    pid = 0;
       treeNode = null;
       treelevel = 1;
      } else if (treeNode) {
       //      
    pid = treeNode.id;
      treelevel = 2;
      }
      $.post(
       "AddNode.action",
       { type: treelevel, id: pid },
       function(nodeIdAndName) {
        var params = /([^\|]+)\|([^\|]+)/.exec(nodeIdAndName);
        if (!((!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) || treeNode.open)) {
         zTree.expandNode(treeNode, true);
        }
        treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });
       });
    }
    元々サブノードを直接追加する場合、親ノードが展開していない場合、同じサブノードを2つ追加します。その後、私は親ノードが展開されているかどうかを判断しましたが、親ノードが展開すれば、同じサブノードが2つ追加されます(初めての場合)、この問題はどう解決しますか?
    方法1 
    
    if (!((!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) || treeNode.open)) {
         zTree.expandNode(treeNode, true);
        }
        treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });
    せいにする
    
    if(!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0)
        {
         treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });
        }
        else if(treeNode.open)
        {
         if(treeNode.isParent)
         {
          zTree.reAsyncChildNodes(treeNode, "refresh");
         }
         else
         {
          treeNode.isParent=true;
          zTree.reAsyncChildNodes(treeNode, "refresh");
         }
        }
        else
        {
         zTree.expandNode(treeNode, true);
         treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });
        }
    問題は解決できますが、最適化はありますか?修正したコードの分類が多すぎると思います。 
    最善の方法
    このように面倒をかけなくてもいいですよね?先日、似たような質問に答えました。
    1、サブノードを追加すると、直接ajaxからバックグラウンドにデータを保存し、successイベントを捕獲する。
    2、ajax success時に、treeNode.zAsync属性を利用して、この親ノードが非同期的なロードを行ったかどうかを知ることができます。falseの場合は直接reAsyncChild Nodes更新します。trueの場合はaddNを利用します。
    
    if ((!treeNode && event.target.tagName.toLowerCase() != "button" && $(event.target).parents("a").length == 0) || treeNode.zAsync) 
         treeNode = zTree.addNodes(treeNode, { id: params[1], pid: pid, isParent: "true", name: params[2], editable: "true", treelevel: treelevel });
        else
         zTree.reAsyncChildNodes(treeNode, "refresh");
    締め括りをつける
    以上は小编が绍介したjQuery zTreeの非同期ローディングにサブノードを追加して问题を缲り返すので、皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに皆さんに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。