<html ng-app="com.ngbook.demo">
<head>
<meta name="description" content="ng trrview example">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<script src="//code.jquery.com/jquery.min.js"></script>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<meta charset="utf-8">
<title>JS Bin</title>
<script src="http://greengerong.github.io/self/cdn/angular.js"></script>
</head>
<body >
<div ng-controller="DemoController as demo" class="container">
<div class="row">
<h2>Tree view</h2>
<tree-view tree-data="demo.tree" text-field="name" value-field='id' item-clicked="demo.itemClicked($item)" item-checked-changed="demo.itemCheckedChanged($item)" can-checked="true" ></tree-view>
</div>
<div class="row">
<h2>Item selected</h2>
<pre>{{demo.selectedItem | json}}</pre>
</div>
<script type="text/ng-template" id="/treeView.html">
<ul class="tree-view">
<li ng-repeat="item in treeData" ng-include="itemTemplateUrl || '/treeItem.html'" ></li>
</ul>
</script>
<script type="text/ng-template" id="/treeItem.html">
<i ng-click="itemExpended(item, $event);" class="{{getItemIcon(item)}}"></i>
<input type="checkbox" ng-model="item.$$isChecked" class="check-box" ng-if="canChecked" ng-change="warpCallback('itemCheckedChanged', item, $event)">
<span class='text-field' ng-click="warpCallback('itemClicked', item, $event);">{{item[textField]}}</span>
<ul ng-if="!isLeaf(item)"
ng-show="item.$$isExpend"
>
<li ng-repeat="item in item.children" ng-include="itemTemplateUrl || '/treeItem.html'">
</li>
</ul>
</script>
</div>
</body>
</html>
ul{
list-style: none;
}
.text-field{
cursor: pointer;
}
.check-box{
width: 24px;
height: 18px;
border-radius: 8px;
}
angular.module("com.ngbook.demo", [])
.controller("DemoController", ['$http',function($http){
var vm = this;
vm.tree = [
{
"id":"1",
"pid":"0",
"name":"家用电器",
"children":[
{
"id":"4",
"pid":"1",
"name":"大家电",
"children":[
{
"id":"7",
"pid":"4",
"name":"空调",
"children":[
{
"id":"15",
"pid":"7",
"name":"海尔空调"
},
{
"id":"16",
"pid":"7",
"name":"美的空调"
}
]
},
{
"id":"8",
"pid":"4",
"name":"冰箱"
},
{
"id":"9",
"pid":"4",
"name":"洗衣机"
},
{
"id":"10",
"pid":"4",
"name":"热水器"
}
]
},
{
"id":"5",
"pid":"1",
"name":"生活电器",
"children":[
{
"id":"19",
"pid":"5",
"name":"加湿器"
},
{
"id":"20",
"pid":"5",
"name":"电熨斗"
}
]
}
]
},
{
"id":"2",
"pid":"0",
"name":"服饰",
"children":[
{
"id":"13",
"pid":"2",
"name":"男装"
},
{
"id":"14",
"pid":"2",
"name":"女装"
}
]
},
{
"id":"3",
"pid":"0",
"name":"化妆",
"children":[
{
"id":"11",
"pid":"3",
"name":"面部护理"
},
{
"id":"12",
"pid":"3",
"name":"口腔护理"
}
]
}
];
vm.itemClicked = function ($item) {
vm.selectedItem = $item;
console.log($item, 'item clicked');
};
vm.itemCheckedChanged = function($item){
$http.post('/url', $item);
console.log($item,'item checked');
};
return vm;
}])
.directive('treeView',[function(){
return {
restrict: 'E',
templateUrl: '/treeView.html',
scope: {
treeData: '=',
canChecked: '=',
textField: '@',
itemClicked: '&',
itemCheckedChanged: '&',
itemTemplateUrl: '@'
},
controller:['$scope', function($scope){
$scope.itemExpended = function(item, $event){
item.$$isExpend = ! item.$$isExpend;
$event.stopPropagation();
};
$scope.getItemIcon = function(item){
var isLeaf = $scope.isLeaf(item);
if(isLeaf){
return 'fa fa-leaf';
}
return item.$$isExpend ? 'fa fa-minus': 'fa fa-plus';
};
$scope.isLeaf = function(item){
return !item.children || !item.children.length;
};
$scope.warpCallback = function(callback, item, $event){
($scope[callback] || angular.noop)({
$item:item,
$event:$event
});
};
}]
};
}]);
Output
300px
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |