У меня следующая установка

  $scope.array = 
    [
      {propertyA: "test", 
       propertyB: {
                   propertyC: [true, true, false]
                  }
      },
      {propertyA: "test2"},
      {propertyA: "test3"}
    ]

А потом

<div ng-repeat="item in array| filter :{propertyB: ''} :true">
     {{item.propertyA}}
</div>

Итак, проблема:

  1. эта настройка ничего не отображает

  2. если я изменяю на |filter :{propertyB: '!!'} :true, он ничего не отображает

  3. если я изменяю на |filter :{propertyB: undefined} :true, он отображает все

Не могу понять.

Цель: я хочу отобразить элементы, для которых propertyB не определено, а в другом случае наоборот.

Изменить 1: если я перебираю массив с angular.equals(item.propertyB, undefined), я получаю false, true, true

Изменить 2: jsfiddle ОБНОВЛЕНО

Редактировать 3: я обновил вопрос

5
Daniel Donev 18 Дек 2015 в 12:38

3 ответа

Лучший ответ

Я закончил этим.

.filter('undefinedProperties', ['$filter', function ($filter) {
        var checkProperty = function (property, returnUndefined) {
            if (returnUndefined) {
                if (property !== undefined) {
                    return true;
                } else {
                    return false;
                }
            } else {
                if (property === undefined) {
                    return true;
                } else {
                    return false;
                }
            }
        };
        return function (input, propertyArray, returnUndefined) {
            if (angular.isArray(propertyArray)) {
                if (angular.isArray(input) && input.length > 0) {
                    angular.forEach(propertyArray, function (property) {
                        for (var i = input.length; i-- > 0;) {
                            if (checkProperty(input[i][property], returnUndefined)) {
                                input.splice(i, 1);
                            }
                        }
                    });
                }
                return input;
            } else {
                throw "PropertyArray is not an array";
            }
        };
    }])
0
Daniel Donev 28 Янв 2016 в 15:01

Вы добавляете filter в ng-repeat, чтобы вы получили collection в качестве входных данных для фильтра вместо одного элемента массива, чтобы ваша реализация не работала.

Как упоминал Кунал, попробуйте сначала отфильтровать массив и повторите процедуру для отфильтрованного массива. или добавьте фильтр внутри двойных фигурных скобок {{}}.

Проверьте это plnkr

1
Venugopal 18 Дек 2015 в 10:08
$scope.array = 
[
  {propertyA: "test", propertyB: "test2"},
  {propertyA: "test2"},
  {propertyA: "test3"}
];
$scope.filteredArray =[];
angular.forEach($scope.array,function(eachData){
   if(angular.isUndefined(eachData.propertyB))
   $scope.filteredArray.push(eachData);
});

И $scope.filteredArray - это массив, который вы хотите, и вы можете использовать его в повторе для связывания в HTML.

1
Kunal Kakkad 18 Дек 2015 в 09:53