You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS实现点击指定文件夹仅展示其子文件夹的问题求助

解决点击单个文件夹仅显示对应子文件夹的问题

你的核心问题在于目前所有文件夹共享同一个more_folders变量,而且没有标记哪个文件夹被触发展开,所以点击任何一个都会让所有文件夹下都显示子内容。另外,你的方法名more_folders和存储子文件夹的变量名重名了,这会导致第一次点击后方法被覆盖,后续点击直接失效。

下面是修改后的完整解决方案:

1. 调整JavaScript代码

首先重命名获取子文件夹的方法,并且给每个文件夹添加独立的状态属性,用来跟踪展开状态和对应的子文件夹:

$scope.getfolders = function(){
  $http({
    method: 'GET' ,
    url: 'link_folders.json',
  })
  .then(function successCallback(data) {
    console.log("folders");
    // 将原字符串数组转为对象数组,给每个文件夹添加状态属性
    $scope.folders = data.data.map(folderPath => ({
      path: folderPath,
      isExpanded: false,
      subfolders: []
    }));
  }, function errorCallback(response) {
    console.log(response);
    console.log('error');
  });
};

$scope.getfolders();

// 重命名方法,避免和变量名冲突
$scope.loadSubfolders = function(folder){
  // 点击已展开的文件夹时直接收起
  if (folder.isExpanded) {
    folder.isExpanded = false;
    return;
  }
  
  $http({
    method: 'GET' ,
    url: 'more_folders.json',
  })
  .then(function successCallback(data) {
    console.log("more_folders");
    // 筛选出当前文件夹下的子文件夹
    folder.subfolders = data.data.filter(subPath => subPath.startsWith(folder.path));
    // 标记当前文件夹为展开状态
    folder.isExpanded = true;
    // 可选:点击新文件夹时自动收起其他已展开的文件夹
    $scope.folders.forEach(f => {
      if (f !== folder) f.isExpanded = false;
    });
  }, function errorCallback(response) {
    console.log(response);
    console.log('error');
  });
};

2. 更新HTML模板

修改模板结构,绑定文件夹对象的独立状态,只在被点击的文件夹下显示子内容:

<li class="left-menu-list-submenu">
  <a class="left-menu-link" href="javascript: void(0);" ng-click="getfolders();">
    <i class="left-menu-link-icon fa fa-folder"></i> Catalogs
  </a>
  <ul class="left-menu-list list-unstyled" style="margin-left:20px;" ng-repeat="fol in folders">
    <li>
      <a style="cursor:pointer;" ng-click="loadSubfolders(fol);">
        {{fol.path}}
        <!-- 可选:添加展开/收起状态图标 -->
        <i ng-if="fol.isExpanded" class="fa fa-caret-down"></i>
        <i ng-if="!fol.isExpanded" class="fa fa-caret-right"></i>
      </a>
      <!-- 仅在当前文件夹展开时显示子文件夹列表 -->
      <ul ng-if="fol.isExpanded" style="margin-left:20px; list-style-type: disc;">
        <li ng-repeat="more in fol.subfolders">
          {{more}}
        </li>
      </ul>
    </li>
  </ul>
</li>

关键改动说明

  • 将原字符串类型的folders数组转为对象数组,每个文件夹拥有独立的isExpanded(展开状态)和subfolders(子文件夹列表)属性,彻底隔离了不同文件夹的状态。
  • 重命名获取子文件夹的方法为loadSubfolders,避免了方法与变量重名导致的覆盖问题。
  • 点击文件夹时,通过startsWith筛选出属于当前文件夹的子内容,只更新当前文件夹的状态,不会影响其他文件夹。
  • 使用ng-if="fol.isExpanded"精准控制子文件夹的显示,只有被点击展开的文件夹才会展示对应的子内容。

这样修改后,点击任意文件夹时,只会在该文件夹下方显示对应的子文件夹,完全符合你的需求。

内容的提问来源于stack exchange,提问作者bafix2203

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:33:11