Фильтр ng-repeat "показывать все", если фильтр не выбран

У меня есть фильтр ng-repeat, который использует меню <select> для фильтрации через кучу стран.

Например:

<div class="col-md-3 col-sm-6" ng-repeat="item in listings | filter: { location: locationFilter }">

Как я могу сделать так, чтобы, если ничего не выбрано, оно автоматически отображает ВСЕ страны? И только начинается фильтрация после выбора конкретной страны?

Я уверен, что это, наверное, простой вопрос, но я совершенно новичок в этом и не мог найти, как это сделать.

Спасибо!

Ответ 1

Если выражение фильтра возвратило undefined, тогда фильтр не применим. Итак, вы можете сделать что-то вроде следующего:

<div ng-repeat="item in listings | filter:(!!locationFilter || undefined) && {location: locationFilter}">
   {{item}}
</div>

(!!locationFilter обрабатывает значения '', фальши и undefined)

plunker

Ответ 2

Я бы посоветовал вам оставить простую декларативную инструкцию в ng-repeat | filter

Затем в тэге <select> добавьте поле для Все, как это:

<select ng-model="search.filter">
    <option value="{{undefined}}">All</option>
    <option ng-repeat="field in locations" value="field">field</option>
</select>

Ответ 3

Вот скрипка, как я достигаю этого http://jsfiddle.net/L5wcgdhy/:-

HTML: -

<div ng-controller="MyCtrl">
 <select ng-model="filter.categoryId">
        <option value="!!"></option>
        <option ng-repeat="category in categories" value="{{category.id}}">{{category.id}}</option>
    </select>
    <table>
        <thead>
            <tr>
                <th>Title</th>
                <th>Category</th>
            </tr>
        </thead>
        <tbody>
            <tr ng-repeat="record in records | filter:filter">
                <td>{{record.title}}</td>
                <td>{{record.categoryId}}</td>
            </tr>
        </tbody>
    </table>
</div>

Ctrl: -

function MyCtrl($scope) {
    $scope.categories = [
        {id: 1},
        {id: 2},
        {id: 3}
    ];

    $scope.filter = {categoryId: "!!"};

    $scope.records = [
        {title: "I'm in category #1!", categoryId: 1},
        {title: "Category 1 is for suckas. #2 ya'll!", categoryId: 2},
        {title: "Three is best", categoryId: 3}
    ];
}

Ответ 4

I have tried this and it worked
<select ng-options="model.FeatureVersion as model.FeatureVersion for model in PostDataResponse" ng-model="featureVersion">
     <option value="">All</option>
    </select>
    <table>
     <tr ng-repeat="model in PostDataResponse  | filter:{FeatureVersion: !!featureVersion?featureVersion: undefined  }">
                <td>{{model.ClientId}}</td>
    </tr>
    </table>