2016-07-14 14 views
3

Ich versuche Objekte, die Objekte sind & nicht null in winkel 1.5.6.Angularjs Filter nicht null für ein Objekt in Wählen ng-Optionen:

Ich habe alle Optionen aus dieser post versucht.

Immer noch kann es nicht funktionieren.

Only 'Sally' in den hier select

gezeigt werden soll, ist der fiddle

HTML:

<div ng-app="myApp" ng-controller="myCtrl"> 
    <br> 

    <select ng-model="a" ng-options="detail.name for detail in details | filter:{shortDescription:'!null'} track by detail.name"> 
    </select> 

    <br> 
    New 

    <select ng-model="b" ng-options="detail.name for detail in details | filter:{shortDescription: ''} track by detail.name"> 
    </select> 

    <br> 
    All 
    <select ng-model="c" ng-options="detail.name for detail in details | filter:{shortDescription: '!!'} track by detail.name"> 
    </select> 

    <br> 
    Without any filter 
    <select ng-model="d" ng-options="detail.name for detail in details track by detail.name"> 
    </select> 
    <!-- --> 
</div> 

Script:

function myCtrl($scope) { 
    $scope.details = [{ 
     name: 'Bill', 
     shortDescription: null 
    }, { 
     name: 'Sally', 
     shortDescription: {'MyName':'A girl'} 
    }]; 
} 

angular.module("myApp",[]).controller("myCtrl", myCtrl); 

Antwort

2

Das Problem ist, dass filter:{shortDescription: ''} Matches nur Primitiven aber nicht komplexe Objekte und shortDescription in Ihrem Fall ist ein verschachteltes Objekt.
Daher statt filter:{shortDescription:{$:''}} wie so verwenden:

<select ng-model="a" 
      ng-options="detail.name for detail in details | filter:{shortDescription:{$:''}} track by detail.name"> 
    </select> 
2

Bitte führen Sie dieses Snippet Ihr Ziel ist es

function myCtrl($scope) { 
 
    $scope.details = [{ 
 
     name: 'Bill', 
 
     shortDescription: null 
 
    }, { 
 
     name: 'Sally', 
 
     shortDescription: {'MyName':'A girl'} 
 
    }]; 
 

 
} 
 

 
angular.module("myApp",[]).controller("myCtrl", myCtrl).filter('descFilter',descFilter); 
 

 
function descFilter(){ 
 
\t return function(array,key){ 
 
    \t var newArr = []; 
 
    for(var i = 0; i < array.length; i++){ 
 
    \t if (array[i][key] != null){ 
 
     newArr.push(array[i]); 
 
     } 
 
    } 
 
    return newArr; 
 
    }; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script> 
 
<div ng-app="myApp" ng-controller="myCtrl"> 
 
    <br> 
 
    With Filter: 
 
    <select ng-model="a" ng-options="detail.name for detail in details | descFilter:'shortDescription'"> 
 
    </select> 
 
    
 
    
 
    <br> 
 
    Without any filter 
 
    <select ng-model="d" ng-options="detail.name for detail in details track by detail.name"> 
 
    </select> 
 
    <!-- --> 
 
</div>

+0

danken Ihnen. Deine Antwort funktioniert tatsächlich. aber das würde bedeuten, ein neues Array innerhalb einer anderen Filterfunktion zu erstellen. Ich suchte nach etwas Grundlegendem, was DAXholic zur Verfügung stellte. –

1

In ngOptions die nicht NULL-Prüfung wissen zu erreichen, nicht zu arbeiten. Stattdessen können Sie einen benutzerdefinierten Filter erstellen und diesen verwenden.

Hier ist ein Beispiel mit einer benutzerdefinierten Filterfunktion. http://jsfiddle.net/ivankovachev/bue59Loj/

Die benutzerdefinierte Filterfunktion:

$scope.isDescriptionNull = function(item) { 
      if (item.shortDescription === null) return false; 

      return true; 
     } 

Und wie man es benutzt:

<select ng-model="a" ng-options="detail.name for detail in (details | filter:isDescriptionNull) track by detail.name"> 
0

Sie einen kleinen Fehler in Ihrem Markup haben.

Der Filter erwartet eine Objekteigenschaft, einen Ausdruck oder einen Komparator.

Offizielle Dokumentation:

{{ filter_expression | filter : expression : comparator : anyPropertyKey}} 

Also, was Sie tun, ist kein gültiger Filter

0
<select ng-model="a" 
      ng-options="detail.name for detail in details | filter:{shortDescription:'!!'}} track by detail.name"> 
    </select>