使用AngularJS预先上传的Sort / GroupBy文件

时间:2015-11-06 02:37:35

标签: javascript angularjs group-by angular-file-upload

我想先将文件分组,然后按照扩展名上传它们(扩展名不能在上传信息定义的mime类型属性中定义。所以我使用了由angular-filter定义的 groupBy 和而是使用函数来获取扩展名,将属性(例如'file.name')放入过滤器Im。 所以我希望我的预加载文件如下所示:

  • 扩展1

file3.Extension1

file1.Extension1

  • 扩展名2

file4.Extension2

file2.Extension2

这是我的EXAMPLE

我的代码:

  <ul>
    <li ng-repeat="f in files | groupBy: fileExtension" style="font:smaller">
        {{f.name}}
    </li>
</ul>

$scope.fileExtension = function(file) {
    return file.name.split('.').pop();
};

任何建议都表示赞赏!

1 个答案:

答案 0 :(得分:2)

我会将您的文件名列表转换为ngController或服务内的文件组列表。在视图中绑定到这个转换后的集合变得微不足道。

$scope.groups = groupByExt(filenames);

function groupByExt(filenames) {
    var extensions = [];
    var groups = [];
    angular.forEach(filenames, function(item) {
        var extension = item.substring(item.lastIndexOf(".")+1);
        if (!extensions[extension]) {
            var group = { name: extension, files: [] };
            extensions[extension] = group;
            groups.push(group);

            group.files.push({ name: item });
        }
        else {
            var group = extensions[extension];
            group.files.push({ name: item});
        }
    });
    return groups;
}

HTML

<ul>
    <li ng-repeat="group in groups">
        {{ group.name }}
        <ul>
            <li ng-repeat="file in group.files">
                {{ file.name }}
            </li>
        </ul>
    </li>
</ul>

Demo

您还可以设置$ watchers,以便在原始文件名列表更改时更新文件组:

$scope.$watchCollection('filenames', function(newVal, oldVal)    {
  if(newVal !== oldVal) {
      $scope.groups = groupByExt(newVal);
  }
});

Demo

我会避免使用过滤器,因为过滤器不应该更改基础项的引用(无限摘要问题)