1

私は、可変数の子を持つことができるこのツリービューを持っています(一部のノードは最大3世代の子を持つことができ、一部は1つしか持つことができません)

私がやろうとしているのは、ツリービューがロードされたときに特定のノードを展開することです。そして、私には 2 つの問題があります: 1) イベント/コールバックが見つからないため、いつツリービューの準備ができたかがわかります 2) 展開機能が常に機能するとは限りません (説明します)

これは私のツリービューです:

function InitializeTreeview() {

var Children_Merchants = {
    transport: {
        read: {
            url: function (options) {
                return kendo.format(websiteRootUrl + '/Merchants/Merchants/?hasParents={0}',   hasParent);
            }
        }
    },
    schema: {
        model: {
             model: {
            id: "ID",
            hasChildren: true,
            children: Children_Merchants
        }
        }
    }
};

var Brandowners = new kendo.data.HierarchicalDataSource({
    transport: {
        read: {
            url: kendo.format(websiteRootUrl + '/Merchants/GetBrandowners?databaseID={0}',       selectedDatabaseID)
      }
    },
    //change: ExpandNode, - if I call expand node like this, it works.
    schema: {
        model: {
            id: "ID",
            hasChildren: true,
            children: Children_Merchants
        }
    }
});


$('#treeview').kendoTreeView({
    dataSource: Brandowners,
    animation: {
        collapse: {
            duration: 200,
            effects: "fadeOut"
        },
        expand: {
            duration: 200,
            effects: "fadeIn"
        }

    },
    dataTextField: "Name",
    complete: function () {  alert('ok'); },
    //dataBound    : ExpandNode,
    select: OnSelect,
    expand: CheckIfHasParent
}).data('kendoTreeView');
}

function ExpandNode() {
    var treeview;
    treeview = $("#treeview").data("kendoTreeView");
    var nodeToExpand = treeview.findByText('Adam'); //dummy txt, will have from parameter
    treeview.expand(nodeToExpand);
}

データバインドは正常に機能し、コントローラーが呼び出され、すべて問題ありません。そこで私が試したのは、ExpandNode 関数をボタンのクリックに接続することです。関数が呼び出されますが、何も起こりません。しかし、親データソースの変更イベントに接続すると機能します。別の興味深い点は、選択が機能することです。つまり、treeview.expand(...) を treeview.select(...) に置き換えると、クリックで機能します。

だから私の質問は:

1)loadEnd(またはそのようなsmth)にどのイベントを使用する必要があるか-関数をボタンクリックにバインドする必要はありません(それでも問題ありませんが、ロードが終了した方が好みです)-PSで見つけたすべてのものを試しましたchange、requestEnd、success、dataBound などの剣道フォーラムが機能しません。問題のノードに対してプロパティ「expanded」をTRUEに設定してJSONを送信しようとしましたが、矢印が開いているように表示されるように変更するだけで、コントローラーを呼び出して子をロードしません。

2) なぜ ExpandNode が変更イベントにバインドされている場合にのみ機能するのか知っていますか? - 私にとって最も重要な質問です。

3)提案がある場合、またはツリービューの初期化で何か間違ったことをした場合は、教えてください。

4

4 に答える 4

3

私はいくつかの自由な解釈であなたのコードをコピーしました。あなたの質問への答えは次のとおりです。

  1. loadEnd => dataBoundにはどのイベントを使用すればよいですか
  2. なぜ ExpandNode が change イベントにバインドされている場合にのみ機能するのか知っていますか? =>いいえ、イベントにバインドしなくても機能しchangeます。そうでない場合は、コードに何か他のものがあります。
  3. 提案=>あなたのコードには、私が実装したものとの違いを生む可能性のある情報が欠けています。
  4. とはCheckIfHasParent? =>実際には何もしない関数として実装しました。
  5. とはhasParent? 無視しました。

私が書いたコード:

$(document).ready(function () {
        function InitializeTreeview() {
            var Children_Merchants = {
                transport: {
                    read: function (op) {
                        var id = op.data.ID;
                        var data = [];
                        for (var i = 0; i < 10; i++) {
                            var aux = id * 100 + i;
                            data.push({ Name: "Name-" + aux, ID: aux});
                        }
                        op.success(data);
                    }
                },
                schema   : {
                    model: {
                        model: {
                            id         : "ID",
                            hasChildren: true,
                            children   : Children_Merchants
                        }
                    }
                }
            };
    
            var Brandowners = new kendo.data.HierarchicalDataSource({
                transport: {
                    read: function (op) {
                        op.success([
                            {"Name": "Adam", "ID": 1},
                            {"Name": "Benjamin", "ID": 2},
                            {"Name": "Caleb", "ID": 3},
                            {"Name": "Daniel", "ID": 4},
                            {"Name": "Ephraim", "ID": 5},
                            {"Name": "Frank", "ID": 6},
                            {"Name": "Gideon", "ID": 7}
                        ])
                    }
                },
                //change: ExpandNode, - if I call expand node like this, it works.
                schema   : {
                    model: {
                        id         : "ID",
                        hasChildren: true,
                        children   : Children_Merchants
                    }
                }
            });
    
            $('#treeview').kendoTreeView({
                dataSource   : Brandowners,
                animation    : {
                    collapse: {
                        duration: 200,
                        effects : "fadeOut"
                    },
                    expand  : {
                        duration: 200,
                        effects : "fadeIn"
                    }
    
                },
                dataTextField: "Name",
                dataBound    : ExpandNode,
                expand       : CheckIfHasParent
            }).data('kendoTreeView');
        }
    
        function ExpandNode() {
            var treeview;
            treeview = $("#treeview").data("kendoTreeView");
            var nodeToExpand = treeview.findByText('Adam'); //dummy txt, will have from parameter
            treeview.expand(nodeToExpand);
        }
    
        function CheckIfHasParent(e) {
        }
    
        InitializeTreeview();
    
 });

ここで遊ぶことができます:http://jsfiddle.net/OnaBai/dSt2h/

于 2013-07-08T22:27:06.600 に答える
1

興味のある方へ:

   function ExpandNode() {
    
   var treeview;
   var node1;

   treeview = $("#treeview").data("kendoTreeView");
   var node2;
   var myURL = kendo.format(websiteRootUrl + '/Merchants/GetPathForSelectedNode?databaseID={0}&merchantID={1}&brandownerID={2}', selectedDatabaseID,MerID,BowID);
       
   node1 = treeview.dataSource.get(BowID);
   node = treeview.findByUid(node1.uid);
   var uid = node1.uid;
   node.find('span:first-child').trigger('click'); //expand 1st level

   $.ajax( {
                            url: myURL,
                            dataType: "json",
                            contentType: 'application/json; charset=utf-8',
                            success: function(result)
                                {
                                   
                                   var length = result.length;
                                 
                                   var lastVal = 1;
                                   for (var i = 1; i < length-1; i++) {
                                        $("#treeview li[data-uid=\'" + uid + "\'] ul.k-group").waitUntilExists (function
                                        () {
                                               i = lastVal; // have to reinitialize i because waitUntilExist's callback will find the i incermented, over the needed value
                                               lastVal++;
                                               node2 = node1.children.get(result[i]);
                                               node = treeview.findByUid(node2.uid);
                                               uid = node2.uid;
                                               node1 = node2;
                                               if(lastVal <= length-1)
                                                    node.find('span:first-child').trigger('click'); // keep expanding
                                               else
                                               {
                                                    treeview.select(node); // just select last node
                                                    currentSelectedNode = node;
                                                }
                                            
                                        });
                                   }
                                   if(length == 2) //select 1st child
                                   {
                                        $("#treeview li[data-uid=\'" + uid + "\'] ul.k-group").waitUntilExists (function
                                        () {
                                               node2 = node1.children.get(result[i]);
                                               node = treeview.findByUid(node2.uid);
                                               uid = node2.uid;
                                               node1 = node2;
                                               treeview.select(node); // just select last node
                                               currentSelectedNode = node;
                                        });
                                   }
                                }
                          });

}

これが私の方法です。for ループは 1 から始まります。これは、配列の最初の要素が最初のノード ID であるためです。これは既に展開済みです。.waitUntilExists は Ryan Lester の方法です (上記のコメントにリンクを追加しました)。同僚の OnaBai、そしてもちろん Ryan Lester に感謝します。これが誰かに役立つことを願っています。乾杯

于 2013-07-12T08:19:57.387 に答える
1
$("#treeview").kendoTreeView({
    animation: {
        expand: true
    },

    dataSource: dataSource,
    dataBound: function (e) {                   
        var tv = $("#treeview").data("kendoTreeView");
        if (tv != null) {
            tv.expand(".k-item");
        }
    },

    dataTextField: "test",
    dataValueField: "id"                
});
于 2014-08-29T09:32:47.927 に答える
0

ypu は、すべてのツリービュー ノードを展開している次のコードによって、ツリービューを展開する準備ができていることを簡単に見つけることができます。また、特定の id またはテキスト hopw をチェックすることによっても見つけることができます。

元:

$("#treeview").kendoTreeView({
                animation: {
                    expand: true
                },

                dataSource: dataSource,
                dataBound: function (e) {                   
                    var tv = $("#treeview").data("kendoTreeView");
                    if (tv != null) {
                        tv.expand(".k-item");
                    }
                },

                dataTextField: "test",
                dataValueField: "id"                
            });
于 2014-04-21T12:58:03.833 に答える