Я использую SmartTable с приложением Angular 1.2.x. В частности, я следую шаблону, в котором список предикатов управляет процессом поиска. Конкретный пример этого приведен на сайте проекта здесь.
Из примера видно, что когда вы выбираете предикат и выполняете поиск, а затем выбираете другой предикат в списке, текстовое поле по-прежнему содержит предыдущие критерии поиска.
Я новичок в AngularJS, и я пытаюсь в AngularJS очистить результаты поиска в событии изменения поля выбора предиката. Моя первая мысль заключалась в том, чтобы подтолкнуть любые манипуляции с DOM за директивой. Поэтому я создал один для сброса критериев поиска под названием «tndResetSearch». Мой синтаксис в нефрите кажется довольно запутанным... если есть лучший способ организовать это, я приветствую совет;):
select.form-control.tnd-reset-search(name="selectedPredicate", type="text" ng-model="selectedPredicate",
ng-options="predicate.PredicateId as predicate.PredicateName for predicate in predicates",
itemdata="predicate", options="#serviceLogSearchBox", resetsearch="resetSearch()")
resetsearch="resetSearch()"
привязан к свойству области изоляции моей директивы.
Реализация этого находится в контроллере, который просто очищает модель от $scope
и повторно заполняет коллекцию, используемую смарт-таблицей для заполнения представления:
$scope.resetSearch = function() {
delete $scope.searchQuery;
$scope.initCollection();
}
$scope.initCollection = function() {
$scope.serviceLogCollection = '';
$scope.serviceLogCollection = [].concat($scope.originalServiceLogCollection);
};
Это выполняется просто отлично, но каждый раз, когда я меняю предикат в поле выбора, предыдущие критерии поиска кэшируются и добавляются к текущим критериям поиска. Таким образом, я получаю подмножество предыдущего поиска. Я не уверен, где происходит кэширование. В $scope
должно быть что-то, на что смотрит директива поиска SmartTable перед следующим поиском. Затем мне нужно будет взглянуть на SmartTable, чтобы увидеть, смогу ли я отследить это, если я не делаю что-то совершенно неправильно в своем подходе.
options="#serviceLogSearchBox"
в поле select
выше было еще одной моей попыткой получить ссылку на связанное окно поиска и очистить его вручную, но это не имело никакого эффекта.
Вот мой первый выстрел в директиву:
angular.module('app').directive('tndResetSearch', [function() {
return {
restrict: 'CA',
replace: false,
transclude: false,
scope: {
index: '=index',
predicate: '=itemdata',
resetSearch: '&resetsearch'
},
link: function(scope, elem, attrs) {
var maxNukes=100, currentNuke=0, triggerKeyDown, nukeSearch;
triggerKeyDown = function (element, keyCode) {
var e = angular.element.Event('keydown');
e.which = keyCode;
element.trigger(e);
};
nukeSearch = function() {
// Trigger keydown event for bound element that uses the stSearch directive???
// This never actually does anything, It just loops forever.
//
// var target = angular.element(attrs.options);
// while (target.val().length > 0 && currentNuke < maxNukes) {
// triggerKeyDown(target, 8); //backspace=8
// currentNuke++;
//}
// Call referenced function on isolate scope
scope.resetSearch();
};
// Modify the DOM the first time the view renders with the first item selected
if (parseInt(scope.index)===0) {
nukeSearch();
}
elem.bind('change', function (evt) {
nukeSearch();
});
}
}
}]);
Кто-нибудь знает, почему я увижу поведение, о котором я упомянул, и я поступаю неправильно? Если да, то как лучше всего использовать Angular 1.2.x и SmartTable?