2015-12-18 2 views
5

У меня есть следующие настройкиAngularjs Фильтр не работает, если свойство не определено

$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 не определены, а в другом случае наоборот.

Edit 1: Если я итерации по массиву с angular.equals(item.propertyB, undefined) я получаю false, true, true

Edit 2: jsfiddle UPDATED

Edit 3: Я обновил вопрос

+1

Plese добавить jsfiddle или plunkr –

+2

Этот вопрос был дан ответ здесь: http://stackoverflow.com/questions/25177004/ng-repeat-filter-for-where-an-attribute-is-undefined –

+1

Просто удалить истину, и все работает! а также !!. – Sim

ответ

0

Я endded вверх, делая это.

.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"; 
      } 
     }; 
    }]) 
1
$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.

+0

Пожалуйста, проверьте обновленный вопрос. –

1

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

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

проверить это plnkr

+0

Проверьте обновленный вопрос. Также я хочу отфильтровать элементы перед их рендерингом (в ng-repeat) –

Смежные вопросы