Поиск смарт-таблицы AngularJS в нескольких столбцах

В смарт-таблицу встроен функционал поиска по всем столбцам (st-search) или по одному нужному столбцу (st-search="'firstName'). Можно ли сделать поиск по нескольким столбцам (не по всем)? Пример : если у меня есть такая таблица: имя, никнейм, адрес с такими данными:

  1. Джон, Джей Джей, Какой-то адрес
  2. Стив, Джон, также обращайтесь
  3. Джейн, Джейн, Джон-Виллидж

и выполните поиск «Джон», в результате должны быть только первые два столбца. Является ли это возможным?


person tadasp    schedule 01.03.2015    source источник
comment
Я предложил способ решения проблемы. Взгляните на ответ!   -  person floatingpurr    schedule 14.09.2015


Ответы (5)


У меня есть аналогичная проблема, и я решил, используя подсказки в этом p/32458981">опубликовать.

Документ Smart Table говорит:

stSetFilter заменяет фильтр, используемый при поиске в Smart Table. Когда поведение по умолчанию для stSearch не соответствует вашим требованиям, например, при выборе, где одна запись является подстрокой другой, используйте настраиваемый фильтр для достижения ваших целей.

и:

Обратите внимание, что st-safe-src требуется для правильного отображения всех отдельных элементов в коллекции. Если бы это было опущено, выборка содержала бы только значения из элементов, видимых в таблице, на которые также влияет пейджинг.

Вы можете объявить свой собственный фильтр внутри элемента таблицы в HTML:

<table ... st-set-filter="myCustomFilter" class="table table-striped">

... и вы можете настроить свой фильтр (в своем приложении) с помощью функции предиката. Это может работать следующим образом:

// filter method, creating `myCustomFilter` a globally
// available filter in our module
.filter('myCustomFilter', ['$filter', function($filter) {

  // function that's invoked each time Angular runs $digest()
  return function(input, predicate) {
    searchValue = predicate['$'];
    //console.log(searchValue);
    var customPredicate = function(value, index, array) {
      console.log(value);

      // if filter has no value, return true for each element of the input array
      if (typeof searchValue === 'undefined') {
        return true;
      }

      var p0 = value['name'].toLowerCase().indexOf(searchValue.toLowerCase());
      var p1 = value['nickname'].toLowerCase().indexOf(searchValue.toLowerCase());
      if (p0 > -1 || p1 > -1) {
        // return true to include the row in filtered resultset
        return true;
      } else {
        // return false to exclude the row from filtered resultset
        return false;
      }
    }

    //console.log(customPredicate);
    return $filter('filter')(input, customPredicate, false);
  }
}])

Я сделал небольшой plnkr, чтобы увидеть фильтр в действии.

person floatingpurr    schedule 14.09.2015

Нет, обходным путем является создание вашей собственной директивы, которая требует контроллера таблицы и дважды вызывает его API (по мере добавления поиска)

directive('stSearch', ['$timeout', function ($timeout) {
    return {
        require: '^stTable',
        scope: {
            predicate: '=?stSearch'
        },
        link: function (scope, element, attr, ctrl) {
            var tableCtrl = ctrl;

            // view -> table state
            element.bind('input', function (evt) {
                evt = evt.originalEvent || evt;
                tableCtrl.search(evt.target.value, 'column1');
                tableCtrl.search(evt.target.value, 'column2');
            });
        }
    };
}]);

вы найдете более подробную информацию в директории stSearch

person laurent    schedule 01.03.2015
comment
Я играл с предложенной вами частью кода, но похоже, что он фильтрует, а не выполняет поиск по нескольким столбцам. Или, может быть, я что-то упускаю :) Взгляните на мой plunker Что я ожидаю например, получить результат с тремя строками (1,4;4,1 и 1,1) при поиске «1» в обоих столбцах. - person tadasp; 02.03.2015
comment
Я протестировал этот код в Angular 1.5.x, и он не смог выполнить поиск по нескольким полям. - person mbokil; 30.12.2016

Вы можете решить эту проблему, создав новую таблицу с поддержкой поиска и объединив поля, которые могут отображаться в одном столбце. пример: если у вас есть поля просмотра IdNo1 и IdNo2 в одном столбце, вы можете объединить их, чтобы добавить новый элемент в массив таблицы.

Просмотр:

внедрение таблицы:

table st-table="displayedCollection" st-safe-src="rowSearchCollection"

Поисковая инъекция:

input type="search" ng-model="idSearch" st-search="idSearch" 

Контроллер:

$scope.rowSearchCollection = [];
vm.searchEnabledTable = function(tableDetails) {
    //$scope.rowSearchCollection = angular.copy(tableDetails); 
    var deferred = $q.defer();              
      if(_.isArray(tableDetails)) {
          _.each(tableDetails, function(element, index, list) {
            $scope.rowSearchCollection[index] = angular.copy(element);
            $scope.rowSearchCollection[index].idSearch = element.IdNo1+','+element.IdNo2;


          });
          deferred.resolve("DATA_PROCESSED");
      } else {
          deferred.reject("NOT_ARRAY");
      }             
      return deferred.promise;
}
person Rahul Mittal    schedule 07.08.2019

проблема с stSetFilter заключается в том, что новый фильтр будет применяться ко всем поискам (st-search), которые вы будете использовать в таблице.

Другая идея: если ваша коллекция данных rowCollection не слишком велика, в javascript в init() страницы сделайте что-то вроде:

self.rowCollection.forEach (функция (элемент) {

element.NameForFilter = element.name+ ' ' + element.nickName;
});

а потом на входе: st-search=NameForFilter

person talia    schedule 22.09.2019

попробуйте st-search="{{firstName + псевдоним}}". Я пробовал со смарт-таблицей v2.1.6, вроде работает.

person jojo    schedule 11.02.2016
comment
Этот ответ неверен. Это как st-search без параметров ТАК ищешь во всем - person amdev; 09.11.2016
comment
Я попробовал это решение. Как отмечалось ранее, он возвращает все. Было бы неплохой функцией, но в настоящее время она ничего не делает в Smart Table, кроме как искать все. - person mbokil; 30.12.2016