AngularJS。我需要紧凑的方式将自定义范围与对象数组合并或与单个对象

时间:2016-01-22 20:49:40

标签: arrays angularjs

在我的应用程序中,我需要上传文件,并尝试实现该功能,允许将新文件添加到文件数组而不是覆盖它。

我就是这样做的:

if (files) {
    angular.forEach(files, function(file) {
        $scope.files.push(file);
    });
}

其中files可以是File对象的数组,也可以只是单个文件。

早期我尝试将文件作为$scope.files.push(files)推送到范围,但结果我得到了嵌套数组的数组,无法通过ng-repeat处理它。

我也尝试了$scope.files.concat(files),但结果我得到了空数组;

我也试过angular.extend($scope.files, files),但结果很奇怪: 当我添加单个文件时,它不会被推送到$ scope.files,而只是将$scope.files第一个元素替换为自身。如果files包含多个元素,则结果相同。

问题:它是否存在更紧凑(也许更快)的方式将自定义范围与对象数组或仅一个对象合并?

第二个问题:为什么当我尝试angular.extend($scope.files, files)时,它没有将两个数组合并为一个数组,包含两者的元素,只是用源代替目标数组?

2 个答案:

答案 0 :(得分:2)

Javascript的Array concat函数返回一个由传入的数组组成的新数组。所以你需要将结果分配回你的范围变量:

if (files) {
  $scope.files = $scope.files.concat(files);
}

答案 1 :(得分:0)

检查files是否是数组或对象,然后是concat或push:

//null check and object check
if (files && typeof files === "object") {
    if (files.length) {
        $scope.files = $scope.files.concat(files); //array merge
    } else {
        $scope.files.push(files); //single obj
    }
}