问题描述
我一直在尝试更新此指令,以将fileList添加到树结构中,但未成功。原始文件工作正常(https://embed.plnkr.co/plunk/JgQu3r),但仅考虑目录。在我的数据结构中,任何目录都可以具有fileList
,以及任何数量的嵌套directoryList
等。
function MainController($scope) {
$scope.menu = [{
name: 'one',directoryList: [{
name: 'one'
},{
name: 'two'
}],fileList: ['one.pdf','two.pdf','three.pdf']
},{
name: 'two',directoryList: [{
name: 'one',directoryList: [{
name: 'one'
}],'three.pdf','four.pdf']
}]
},{
name: 'three'
}
];
}
function myMenu() {
return {
scope: {
myMenu: '=myMenu'
},template: '<li ng-repeat="item in myMenu"><my-menu-item></my-menu-item></li>',link: function(scope,elem) {}
}
}
function myMenuItem($compile) {
return {
template: '<a href ng-bind="item.name" ng-click="show($event)"></a>',element) {
if (angular.isArray(scope.item.menu)) {
element.append($compile('<ul ng-if="collapsed" my-menu="item.menu"></ul>')(scope));
}
scope.show = function($event) {
scope.collapsed = !scope.collapsed;
}
}
}
}
angular.module('app',[])
.controller('MainController',MainController)
.directive('myMenu',myMenu)
.directive('myMenuItem',myMenuItem);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.14/angular.js"></script>
<body ng-app="app" ng-controller="MainController">
<ul my-menu="menu">
</ul>
</body>
解决方法
您需要区分文件和文件夹。就像对待示例中那样对待文件夹,然后分别对待文件。以下代码段有效,但我建议您花一点时间思考其原因和工作方式。
function MainController($scope) {
$scope.menu = [{
name: 'one',directoryList: [{
name: 'one'
},{
name: 'two'
}],fileList: ['one.pdf','two.pdf','three.pdf']
},{
name: 'two',directoryList: [{
name: 'one',directoryList: [{
name: 'one'
}],'three.pdf','four.pdf']
}]
},{
name: 'three'
}
];
}
function myMenu() {
return {
scope: {
myMenu: '=myMenu'
},template: '<li ng-repeat="item in myMenu"><my-menu-item></my-menu-item></li>',link: function(scope,elem) {}
}
}
function myMenuItem($compile) {
return {
template: `
<a href ng-bind="item.name" ng-click="show($event)"></a>
`,element) {
if (angular.isArray(scope.item.directoryList)) {
element.append($compile('<ul ng-if="!collapsed" my-menu="item.directoryList"></ul>')(scope));
}
if (angular.isArray(scope.item.fileList)) {
element.append($compile(`
<ul ng-if="item.fileList && !collapsed">
<li ng-repeat="file in item.fileList">{{file}}</li>
</ul>
`)(scope));
}
scope.collapsed = true;
scope.show = function($event) {
scope.collapsed = !scope.collapsed;
}
}
}
}
angular.module('app',[])
.controller('MainController',MainController)
.directive('myMenu',myMenu)
.directive('myMenuItem',myMenuItem);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.14/angular.js"></script>
<body ng-app="app" ng-controller="MainController">
<ul my-menu="menu">
</ul>
</body>