AngularJS, нг-повтор с условием - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в AngularJS (2 дня). У меня есть этот код:

<tr class="factoring-grid__row fixed_row" ng-if="vm.filteredXml.length > 0" ng-class="{disabled: vm.disableMyData(item)}"
  ng-repeat="(index, item) in vm.filteredXml">
  <td>{{item.receptor.razonSocial}}</td>
  <td>{{item.folio}}</td>
  <td style="text-align: center">
    <div class="form-group datetime" style="display: flex">
      <div class="factoring-grid__date-picker">
        <input type="text" autocomplete="off" class="form-control input-sm" uib-datepicker-popup="{{vm.format}}"
          ng-model="vm.filteredXml[index].fechaVencimiento" is-open="vm.datePickerList[index].isOpen"
          datepicker-options="vm.dateOptions" current-text="Hoy" close-text="Cerrar" clear-text="Reset"
          alt-input-formats="vm.altInputFormats" popup-placement="top-right" style="width: 100%;" />
      </div>
      <span ng-click="vm.openDatePicker(index)" class="calendar-icon"></span>
    </div>
  </td>
  <td>
    <span>{{item.montoTotal | filterPesoChile}}</span>
  </td>
</tr>

Мне нужно отфильтровать данные, я имею в виду, что эти item имеют свойство ie с именем item.status, поэтому мне нужно избегать рендеринга как элементов, где item.status === 'deleted'. Should I filter right here that condition? or should I filter the data that use this ng-repeat ( vm.filteredXml`).

Я не привык к angularjs директивам. В reactjs я просто отображаю или фильтрую массив данных и возвращаю каждое из них, но не знаю, как это сделать с помощью ng-repeat

1 Ответ

0 голосов
/ 10 апреля 2020

Ниже приведен пример фрагмента с использованием директивы и специального фильтра с необязательным состоянием (по умолчанию disabled)

Шаблон директивы встроен, поскольку я не могу добавить внешний файл в фрагмент StackOverflow.

(function () {
    'use strict';

    angular.module('app', []);

    angular
        .module('app')
        .directive('items', function () {
            return {
                restrict: 'EAC',
                scope: {},
                template: '<ul><li ng-repeat="item in vm.items|excludedItemsFilter:\'disabled\'">{{item.label}}</li></ul>',
                link: link,
                controller: controller,
                controllerAs: 'vm'
            };

            function link(scope, element, attrs) {

                scope.$on('$destroy', function () {
                    // destroy events binded to $rootScope, 
                    // cancel $interval and $timeout timers
                });
            }

            function controller($scope) {
                var vm = this;

                vm.items = [
                    {label: "Item 1", status: "enabled"},
                    {label: "Item 2", status: "enabled"},
                    {label: "Item 3", status: "disabled"},
                    {label: "Item 4", status: "enabled"},
                    {label: "Item 5", status: "disabled"}
                ];
            }
        });

    angular
        .module('app')
        .filter('excludedItemsFilter', function () {
            return function (items, excludedStatus) {
                excludedStatus = excludedStatus || 'disabled'; // default value
                return items.filter(function (item) {
                    return item
                        && item.status !== excludedStatus;
                });
            }
        });

})();
<!DOCTYPE html>

<html lang="en" ng-app="app">
  <head>
    <meta charset="utf-8" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.min.js"></script>
    <script src="module.js"></script>
  </head>

  <body>
    <div items></div>
  </body>
</html>

Вы также можете удалить специальный фильтр и фильтровать элементы в директиве, например:

angular.module("app").directive("items", function () {
  return {
    restrict: "EAC",
    scope: {},
    template: '<ul><li ng-repeat="item in vm.items">{{item.label}}</li></ul>',
    link: link,
    controller: controller,
    controllerAs: "vm",
  };

  function link(scope, element, attrs) {
    scope.$on("$destroy", function () {
      // destroy events binded to $rootScope,
      // cancel $interval and $timeout timers
    });
  }

  function controller($scope) {
    var vm = this;

    vm.items = [
      { label: "Item 1", status: "enabled" },
      { label: "Item 2", status: "enabled" },
      { label: "Item 3", status: "disabled" },
      { label: "Item 4", status: "enabled" },
      { label: "Item 5", status: "disabled" },
    ].filter(function (item) {
      return item && item.status !== "disabled";
    });
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...