Как очистить ng-repeat перед фильтрацией

0

Эффект, который я хочу, состоит в том, чтобы очистить все элементы внутри повтора до его фильтрации. Поэтому, когда я нажимаю кнопку фильтра, ng-repeat должен исчезать, а затем все элементы, соответствующие типу фильтра, должны исчезать.

Теперь проблема заключается в том, что при щелчке по типу фильтра = all для type = web возникают некоторые странные проблемы с позиционированием, когда они исчезают из всех элементов, которые не соответствуют типу фильтра, на который было нажато. Поэтому я хочу оживить все предметы, которые ушли, и исчезнуть в элементах, которые нам нужны.

page.html

<button type="button" class="filter-click" ng-click="myFilter = {type: 'web'}">Web</button>
<button type="button" class="filter-click" ng-click="myFilter = {type: 'all'}">Web</button>
<button type="button" class="filter-click" ng-click="myFilter = {type: 'print'}">Web</button>

<div class="portfolio-item" ng-repeat="item in xList | filter:myFilter">test</div>

Я попытался использовать директиву, но понятия не имею, как вызвать фильтр. scope.myFilter не определено.

Теги:

1 ответ

0

Вы можете использовать ngAnimate, поэтому у вас есть больше классов для игры, и вы можете сделать fadeout и fadein с помощью CSS3.

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

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

    $scope.filterBy = '*';

    $scope.filter = function(filterBy) {
      $scope.filterBy = filterBy;
    };

    //Items in JSON
    $scope.portfolios = [{
      "id": 10,
      "filters": ["web"],
      "title": "East Boambee Web"
    }, {
      "id": 11,
      "filters": ["web"],
      "title": "Quisque id odio Web"
    }, {
      "id": 12,
      "filters": ["print"],
      "title": "Pellentesque ut neque Print"
    }, {
      "id": 13,
      "filters": ["web"],
      "title": "Proin viverra ligula Web"
    }, {
      "id": 14,
      "filters": ["print"],
      "title": "Maecenas egestas arcu Print"
    }, {
      "id": 15,
      "filters": ["web"],
      "title": "Boambee Web"
    }, {
      "id": 16,
      "filters": ["web"],
      "title": "Id odio Web"
    }, {
      "id": 17,
      "filters": ["print"],
      "title": "Ut neque Print"
    }, {
      "id": 18,
      "filters": ["web"],
      "title": "Viverra ligula Web"
    }, {
      "id": 19,
      "filters": ["print"],
      "title": "Egestas arcu Print"
    }, {
      "id": 20,
      "filters": ["web","print"],
      "title": "Web Boambee"
    }];
  }
]);


//Filter
app.filter('myFilter', function() {
  return function(items, condition) {

    //Show All
    if (condition.filters === undefined || condition.filters === '*') {
      return items;
    }

    //Only if is part of the array (frontend only, if the filter has been made on backend, get rid of this method)
    var filtered = [];
    angular.forEach(items, function(item) {
      if (item.filters.indexOf(condition.filters) !== -1) { //inArray() in JS
        filtered.push(item);
      }
    });
    return filtered;
  };
});
.item.ng-enter,
.item.ng-leave {
  -webkit-transition: 400ms cubic-bezier(0.250, 0.100, 0.250, 1.000) all;
  -moz-transition: 400ms cubic-bezier(0.250, 0.100, 0.250, 1.000) all;
  -ms-transition: 400ms cubic-bezier(0.250, 0.100, 0.250, 1.000) all;
  -o-transition: 400ms cubic-bezier(0.250, 0.100, 0.250, 1.000) all;
  transition: 400ms cubic-bezier(0.250, 0.100, 0.250, 1.000) all;
  position: relative;
  display: block;
}
.item.ng-leave.ng-leave-active,
.item.ng-enter {
  -webkit-transform: scale(0);
  -moz-transform: scale(0);
  -ms-transform: scale(0);
  -o-transform: scale(0);
  transform: scale(0);
  height: 0;
  opacity: 0;
}
.item.ng-enter.ng-enter-active,
.item.ng-leave {
  -webkit-transform: scale(1);
  -moz-transform: scale(1);
  -ms-transform: scale(1);
  -o-transform: scale(1);
  transform: scale(1);
  height: auto;
  opacity: 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.16/angular.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.16/angular-animate.js"></script>

<div ng-app="myApp">
  <div ng-controller="ItemsController">

    <div class="row">
      <button class="btn" ng-click="filter('*')">show all</button>
      <button class="btn" ng-click="filter('web')">Web</button>
      <button class="btn" ng-click="filter('print')">Print</button>
    </div>
    <!-- /.row -->

    <div class="row">
      <div ng-animate="'animate'" class="item col" ng-repeat="portfolio in portfolios | myFilter:{filters:filterBy} | limitTo:12 ">
        <h2>{{portfolio.id}}: {{portfolio.title}}</h2>
        <p>
          <span ng-repeat="filter in portfolio.filters">{{filter}}</span>
        </p>
        <hr>
      </div>
      <!-- /.item -->
    </div>
    <!-- /.row -->
  </div>
  <!-- /ItemsController -->
</div>
<!-- /myApp -->

Вот плункер с примером AJAX: http://plnkr.co/edit/ZiGIfuuGnPrwRImxhiMM?p=preview

Ещё вопросы

Сообщество Overcoder
Наверх
Меню