var app = angular.module('app', []); var ctrl = app.controller('ctrl', function($scope, $rootScope) { $scope.nodes = [{ Title: 'Title 1', nodes: [{ Title: 'Title 1.1', nodes: [] }, { Title: 'Title 1.2', nodes: [] }] }, { Title: 'Title 2', nodes: [{ Title: 'Title 2.1', nodes: [{ Title: 'Title 2.1.1', nodes: [] }, { Title: 'Title 2.1.2', nodes: [] }] }, { Title: 'Title 2.2', nodes: [{ Title: 'Title 2.2.1', nodes: [] }, { Title: 'Title 2.2.2', nodes: [] }, { Title: 'Title 2.2.3', nodes: [] }, { Title: 'Title 2.2.4', nodes: [] }] }] }]; $scope.$on('articleEdited', function(evt, node) { alert('Edited ' + node.Title); }); $scope.$on('articleDeleted', function(evt, node) { alert('Deleted ' + node.Title); }); }); app.directive('nodeList', function($parse) { return { restrict: 'E', scope: { nodes: '=ngModel' }, template: '<div close-others="true"><node ng-repeat="item in nodes" ng-model="item" ></node></div>', controller: function($scope) { this.deleteArticle = function(node) { var index = $scope.nodes.indexOf(node); if (index >= 0) { $scope.nodes.splice(index, 1); $scope.$emit('articleDeleted', node); } } this.editArticle = function(node) { var index = $scope.nodes.indexOf(node); if (index >= 0) { $scope.$emit('articleEdited', node); } } }, link: function($scope, $element, $attrs) {} }; }); app.directive('node', function($compile) { return { restrict: 'E', require: '^nodeList', scope: { node: '=ngModel' }, controller: function($scope) { }, template: '<div><span ng-click="node.hidden = !node.hidden">{{node.Title}}</span><a href="#" ng-click="edit(node)">Edit</a> <a href="#" ng-click="delete(node)">Delete</a></div>', link: function($scope, $element, $attrs, nodeListController) { var template = angular.element('<node-list ng-model="node.nodes" ng-hide="node.hidden"></node-list>'); $element.append(template); $compile(template)($scope); $scope.delete = function(node) { nodeListController.deleteArticle(node); } $scope.edit = function(node) { nodeListController.editArticle(node); } } }; });
div { margin-left: 20px; }
<!DOCTYPE html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> </head> <body ng-app="app" ng-controller="ctrl"> <node-list ng-model="nodes"> </node-list> </body> </html>