2014-01-12 5 views
38

私のAngularJSプロジェクト(v1.2.3)には、ルートのリストがあり、オブジェクトからナビゲーションバーを作成しようとしています。私がしたいのは、あるスタイルで定義されていないisRightのオブジェクトを表示し、別のスタイルでそのプロパティが定義されている場所を表示することです。AngularJS - ng-repeatの未定義プロパティのフィルタ?

ng-repeat私はこれらのオブジェクトを定義されていないisRightプロパティでフィルタリングしたいと思います。カスタムフィルター機能の作成に頼ることなく、ng-repeat属性内でこれをどのように達成できますか?

$scope.nav = [ 
    { path: '/', title: 'Home' }, 
    { path: '/blog', title: 'Blog' }, 
    { path: '/about', title: 'About' }, 
    { path: '/login', title: 'Login', isRight: true } 
]; 

私はちょうど各オブジェクトに属性isRight: falseを追加することができます実現、または左右のサイドリンク、および他のこのような簡単な回避策については、別のnavオブジェクトを持っていますが、これを実現する方法がある場合、私は好奇心現在の構造で、の線に沿って何か使用して:

<li ng-repeat="link in nav | filter:{isRight:undefined}"> 

する。これは、必要以上に好奇心ですが、私はどんな提案を感謝しています。

+1

も参照は同じ問題を持っていました。プロパティに値がないときは 'prop:undefined'、プロパティがオブジェクトだったときは' prop:{} 'を使用しました。問題は、プロパティが不足しているときにこれらのいずれも含まれていないことです。この質問をお寄せいただき、ありがとうございました。私は魔法の「!」と「!!」を見つけました。 – TWiStErRob

答えて

51

であるためにあなたの繰り返しを変更するメソッドを作成します。したがって、undefinedを処理する代わりに、isRightが(!)でないものを除外することができます。このように:

<li ng-repeat="link in nav | filter:{isRight:'!true'} "> 

そして、あなたができる反対のために、当然のことながら、実行します。

<li ng-repeat="link in nav | filter:{isRight:'true'} "> 

demo fiddle

+2

ありがとう!私は何度も似たようなことを試みましたが、否定をどこにでも置いていましたが、引用の中に**入れました。単純な 'ng-if'がこれまで私が達成した唯一の方法でした。 – haferje

+0

編集:それでも、ちょっとだけエレガントなものがあって、単にプロパティーが未定義で、単に「!true」や「false」ではないという印象を与えてくれることを望みます。 – haferje

+0

そうですが、 'isRight'が定義されていないnav要素をキャッチすることを意味する真のケースであることを明確にするコメントを書く価値があるかもしれません。 – KayakDave

8

編集

私は質問を再読し、これはあなたが探している答えではありません。ドキュメントの目的でここに残しておきますが、カスタムフィルタを作成せずにカスタムフィルタ関数を使用することなく、必要な機能を得る方法はないと思います。

未定義を探すのがデフォルトのフィルタで機能しない理由は、AngularJS filterの実装のコードです。

switch (typeof expression) { 
    ... 
    case "object": 
    // jshint +W086 
    for (var key in expression) { 
     (function(path) { 
     if (typeof expression[path] == 'undefined') return; 
     predicates.push(function(value) { 
      return search(path == '$' ? value : getter(value, path), expression[path]); 
     }); 
     })(key); 
    } 
    break; 
    ... 
} 

フィルタオブジェクトのプロパティの値がundefinedある場合、述語関数は、述部の配列に追加されません。あなたの場合、isRightプロパティの値をundefined(フィルタ式は{isRight:undefined})に設定しています。

オリジナル回答

あなたは常に、任意のフィルタを作成するために、述語関数を使用することができます(documentation)。

述語関数を使用して任意のフィルタを書き込むことができます。配列の要素ごとに 関数が呼び出されます。最終結果は、述部がtrueを戻した要素の配列 です。お使いのコントローラで

あなたは

$scope.isRightUndefined = function(item) { 
    return item.isRight === undefined; 
} 

をしたい項目を選んで、あなたは、フィルタ式を否定することができます

<li ng-repeat="link in nav | filter:isRightUndefined"> 
+1

これは良い答えですが、はい、私が望んでいたものではありません。私はまた、他の人が偶然に遭遇することのある文書化の回答を残すこと、そしてそれが受け入れられた後に回答を残すことも信じています。現在、@ KayakDaveのソリューションを使用しています。 – haferje

+0

あなたのオリジナルの答えは実際には角1.2.1で私のために働いているようです:http://jsfiddle.net/Cg8kF/90/ – VitalyB

+1

これはあなたが探しているドロイドではありません... – LeadingLight

4
module.filter('notNullOrUndefined', [function() { 
    return function (items, property) { 
     var arrayToReturn = []; 
     for (var i = 0; i < items.length; i++) { 
      var test = property !== undefined ? items[i][property] : items[i]; 
      if (test !== undefined && test !== null) { 
       arrayToReturn.push(items[i]); 
      } 
     } 
     return arrayToReturn; 
    }; 
}]); 

使用法:あなたが使用することもでき

<div class="col-md-12" ng-repeat="style in styles | notNullOrUndefined:'background'"> 
    <span class="ed-item">{{style.name}} Background</span> 
</div> 
+0

コードに感謝します。次回はこのようなものが必要になると便利です。しかし、私の元の質問は、カスタムフィルタに頼ることなく、このようなことを達成する方法でした。 – haferje

41

<li ng-repeat="link in nav | filter:{isRight:'!'}">

How to display placeholders in AngularJS for undefined expression values?

var app = angular.module('myApp', []) 
 

 
app.controller('mainCtrl',['$scope' , function($scope) { 
 

 

 
$scope.nav = [ 
 
    { path: '/', title: 'Home' }, 
 
    { path: '/blog', title: 'Blog' }, 
 
    { path: '/about', title: 'About' }, 
 
    { path: '/login', title: 'Login', isRight: true } 
 
]; 
 
    
 
}])
<div ng-app="myApp" ng-controller="mainCtrl"> 
 

 
<h3>!isRight</h3> 
 
<ul> 
 
<li ng-repeat="link in nav | filter:{isRight:'!'}">{{link.title}}</li> 
 
</ul> 
 
    
 
    
 
<h3>isRight</h3> 
 
<ul> 
 
<li ng-repeat="link in nav | filter:{isRight:'!!'}">{{link.title}}</li> 
 
</ul> 
 
</div> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

+5

オハイオ州、これは本当の取引の赤ちゃんです – user1576978

+5

いいです! 'id'プロパティを持たないオブジェクトをフィルタリングする必要があり、次のような処理を行うと、エントリ内の' ng-repeat = "エントリ| filter:{id: '!!' } ' – Andris

+3

これは私が探していた答えです、より高いランク付けされるべきです! – Hinrich

関連する問題