2016-10-12 10 views
1

私のテキストボックスにバインドされるモデルを決定するためにチェックされるモデルプロパティにバインドされたドロップダウンがあるとします。ドロップダウン選択に基づくangularJSの条件付きモデルバインド

ユーザーが検索がそのオフに基づいてされ、それはそれは次のように表示されている searchQuery.idまたは searchQuery.Firstname

可能性のいずれか、選んだものは何でも

<select ng-model="searchType"> 
    <option value="Id">Id</option> 
    <option value="Firstname">Firstname</option> 
</select> 

:私は、コードを使用しようとした

<tr ng-repeat="user in users | orderBy:sortColumn:sortDescending | filter:searchQuery"> 
     <td>{{ user.Id }}</td> 
     <td>{{ user.Firstname }}</td> 
     <td>{{ user.LastName }}</td> 
</tr> 

getter/setterを使用している同様のトピックから、私はそれを動作させるように見えることはできません。

どうすればよいですか?

答えて

3

$scope.search = {}のようなコントローラ内のオブジェクトはsearchであり、そのフィルタに検索オブジェクトを配置できます。

<select ng-model="searchType"> 
    <option value="Id">Id</option> 
    <option value="Firstname">Firstname</option> 
</select> 
<input class="form-control" ng-model="search[searchType]" ng-disabled="!searchType.length"/> 

<tr ng-repeat="user in users | orderBy:sortColumn:sortDescending | filter: search"> 
    <td>{{ user.Id }}</td> 
    <td>{{ user.Firstname }}</td> 
    <td>{{ user.LastName }}</td> 
</tr> 

上記動作しますけれどもが、あなたは意図したとおり、それは今で動作しますドロップダウン変更した場合。ドロップダウンの値を変更すると、searchオブジェクトがクリアされます。検索がより正確になるように。

ng-repeat="user in users | .... | filter:conditionalSearch()" 

してから、コントローラ/リンクでこれを追加します:私は間違っていない場合は、あなたがこれを行うことができ

Demo Plunkr

+2

はこれに基づいてplunkerを作りましたテストのための良い答え:https://embed.plnkr.co/MDlUpFFRKxQRg7rCO61v/ –

+1

ああ、うわー!私はこれについて知らなかった!部分一致も同様にします! – Zach

+0

@ NathanBeckはplunkrのおかげで、コード内に小さなバグがありました。ドロップダウンの 'search'オブジェクトがプロパティ値を保持していたことを変更しました。だから私はドロップダウンの変更よりもはっきりしています。 –

2

$scope.conditionalSearch = function() { 
    if ($scope.searchType == 'id') return { .. condition 1 .. } 
    if ($scope.searchType == 'firstName') return { .. condition 2 .. } 
} 
+0

閉じる! 'conditionalSearch'関数は、現在のユーザが渡された関数を返す関数です! '$ scope.conditionalSearch = function(){return function(currentUser){return currentUser [$ scope.SearchType] == $ scope.criteria; }}; 'しかし、searchTypeが大文字小文字を含むユーザプロパティ名と一致することを確認してください。 – Zach

+0

@Zach他の回答のコードを大幅に変更しないでください。代わりに、他人とスレッド全体に利益をもたらすかもしれないと思うなら、あなた自身の答えを投稿してください。 –

+0

@EmileBergeron許してください。私は彼の答えが私のものを掲示するのではなく、変更とクレジットを保証するのに十分に近いと感じました。 – Zach

関連する問題