Skip to content

Commit ce76f61

Browse files
committed
Refact the new ui tree
- add uiTreeNode directive - add nodeId or treeId in scope to isolate This commit fixed the render bug when load node children dynamicly
1 parent f1b1026 commit ce76f61

File tree

2 files changed

+78
-19
lines changed

2 files changed

+78
-19
lines changed

demo/app.js

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
angularUiTreeDemo = angular.module("angularUiTreeDemo",["angularUiTree"]);
22
angularUiTreeDemo.controller("MainCtrl",function($scope){
3+
var test = [];
4+
test.abc = 123;
35
$scope.treeSource = [
46
{
57
id: 1,
6-
name: 'jack'
8+
name: 'jack',
9+
isOpen: true,
710
},
811
{
912
id: 2,
1013
name: 'ivan',
14+
isOpen: true,
1115
children: [
1216
{
1317
id: 3,
1418
name: 'ivan`s son',
19+
isOpen: true,
1520
children: [
1621
{
1722
id: 4,
18-
name: 'ivan`s grandson'
23+
name: 'ivan`s grandson',
24+
isOpen: true,
25+
children: test
1926
}
2027
]
2128
}

src/uiTree.js

+69-17
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,88 @@
55
return {
66
restrict: "A",
77
scope: {
8-
treeSource: "=uiTree"
8+
treeSource: "=uiTree",
9+
parent: "=nodeParent"
910
},
1011
compile: function(element, attr) {
11-
var $nodeTemplate = element.find("[node]").first().remove();
12-
var nodeName = $nodeTemplate.attr("node");
12+
var nodeStr = element.find("[node]").first()[0].outerHTML;
13+
element.find("[node]").first().hide();
1314

1415
function preLink ($scope, $element, $attr) {
15-
16+
1617
}
1718

18-
function postLink ($scope, $element, $attr, ctrl, $transclude) {
19+
function postLink ($scope, $element, $attr) {
20+
var $originNode = $element.find("[node]").first();
21+
var $nodeTemplate = $(nodeStr);
22+
var $newNode = $(nodeStr);
23+
var nodeName = $originNode.attr("node");
1924

20-
var treeSourceName = $attr["uiTree"].replace(nodeName+".", "");
21-
console.log(treeSourceName);
25+
var treeId = "ui_tree_" + Math.floor((Math.random() * 999999999) + 1);
2226

2327
function postCompile(){
24-
var $nodeChildrenTemplate = $nodeTemplate.find("[node-children]").first();
25-
var nodeChildrenName = $nodeChildrenTemplate.attr("node-children");
26-
$nodeChildrenTemplate.append($nodeTemplate.clone());
27-
$nodeChildrenTemplate.attr("ui-tree", nodeChildrenName);
28-
var $newNode = $($nodeTemplate[0].outerHTML);
29-
$newNode.attr("ng-repeat", nodeName + " in treeSource")
30-
$element.append($newNode);
28+
$newNode.find("[node-children]").first().append($nodeTemplate);
29+
$newNode.attr("ng-repeat", nodeName + " in " + treeId);
30+
$newNode.attr("ui-tree-node", nodeName);
31+
$originNode.replaceWith($newNode);
32+
$newNode.show();
3133
$compile($newNode)($scope);
3234
}
3335

3436
var unwatch = $scope.$watch("treeSource",function(){
35-
if($scope.treeSource) {
37+
if($scope.treeSource && !$scope.$isCompiled) {
38+
$scope[treeId] = $scope.treeSource;
39+
postCompile();
40+
unwatch();
41+
$scope.$isCompiled = true;
42+
$scope.__proto__ = $scope.$parent;
43+
}
44+
})
45+
}
46+
47+
return {
48+
pre: preLink,
49+
post: postLink
50+
}
51+
}
52+
};
53+
});
54+
55+
angularUiTree.directive("uiTreeNode",function($compile){
56+
return {
57+
restrict: "A",
58+
scope: {
59+
nodeSource: "=uiTreeNode"
60+
},
61+
compile: function(element, attr) {
62+
var nodeChildrenStr = element.find("[node-children]").first()[0].outerHTML;
63+
64+
function preLink ($scope, $element, $attr) {
65+
66+
}
67+
68+
function postLink ($scope, $element, $attr) {
69+
var $originNodeChildren = $element.find("[node-children]").first();
70+
var $newNodeChildren = $(nodeChildrenStr);
71+
72+
var nodeChildrenName = $originNodeChildren.attr("node-children");
73+
var nodeId = "ui_tree_node_" + Math.floor((Math.random() * 999999999) + 1);
74+
var nodeName = $attr["node"];
75+
var treeSourceName = nodeChildrenName.replace(nodeName, nodeId);
76+
77+
function postCompile(){
78+
$newNodeChildren.attr("ui-tree", treeSourceName);
79+
$newNodeChildren.attr("node-parent", nodeId);
80+
$originNodeChildren.replaceWith($newNodeChildren);
81+
$compile($newNodeChildren)($scope);
82+
}
83+
84+
var unwatch = $scope.$watch("nodeSource",function(){
85+
if($scope.nodeSource && !$scope.$isCompiled) {
86+
$scope[nodeId] = $scope.nodeSource;
3687
postCompile();
37-
unwatch();
88+
unwatch();
89+
$scope.$isCompiled = true
3890
$scope.__proto__ = $scope.$parent;
3991
}
4092
})
@@ -45,6 +97,6 @@
4597
post: postLink
4698
}
4799
}
48-
};
100+
};
49101
});
50102
})();

0 commit comments

Comments
 (0)