2015-12-18 6 views
5

Ich habe folgendes SetupAngularJS Filtern funktioniert nicht, wenn die Eigenschaft nicht definiert ist

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

und dann

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

Das Problem ist also:

  1. diese Einstellung nicht angezeigt wird alles

  2. wenn ich zu |filter :{propertyB: '!!'} :true ändert es nichts

  3. angezeigt werden, wenn ich zu |filter :{propertyB: undefined} :true ändern sie alles

zeigt Ich kann nicht es herausfinden.

Ziel: Ich möchte die Artikel anzeigen, die die propertyB undefined und in anderen Fällen umgekehrt haben.

Edit 1: Wenn ich über das Array iterieren mit angular.equals(item.propertyB, undefined) ich false, true, true

Edit 2: jsfiddle UPDATED

Bearbeiten 3: Ich habe die Frage

aktualisiert
+1

Plese hinzufügen jsfiddle oder plunkr –

+2

Diese Frage hier beantwortet wurde: http://stackoverflow.com/questions/25177004/ng-repeat-filter-for-where-an-attribute-is-undefined –

+1

Nur entfernen Sie wahr und alles funktioniert mit! und !!. – Sim

Antwort

0

ich endded dies oben tun.

.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); 
}); 

Und die $scope.filteredArray ist Array Sie wollen und Sie können es in Wiederholung für die Bindung in HTML verwenden.

+0

Bitte überprüfen Sie die aktualisierte Frage. –

1

Sie fügen filter auf ng-repeat, so erhalten Sie eine collection, als Eingabe für den Filter, anstelle von einem einzelnen Array-Element, so dass Ihre Implementierung nicht funktioniert.

wie Kunal erwähnt, versuchen Sie das Array vorher zu filtern und wiederholen Sie auf gefilterten Array. oder fügen Sie einen Filter in doppelte geschweifte Klammern {{}}.

Kontrolle dieses plnkr

+0

Bitte überprüfen Sie die aktualisierte Frage. Auch ich möchte die Elemente filtern, bevor ich sie rendere (in der ng-Wiederholung) –