Я пытаюсь применить фильтр к массиву, так как он изменяется в JS, он возвращается обратно в HTML (из-за двусторонней привязки). Это контроллер, который я использую:
app.controller('controlador1', ["filterFilter", "$scope", function(filterFilter, $scope) {
this.array = [
{name: 'Tobias'},
{name: 'Jeff'},
{name: 'Brian'},
{name: 'Igor'},
{name: 'James'},
{name: 'Brad'}
];
var active = false;
$scope.applyFilter = function(){
if(!active){
$scope.arrayFiltrado = filterFilter(this.array, "a");
active = true;
}else{
$scope.arrayFiltrado = this.array;
active = false;
}
}
$scope.arrayFiltrado = this.array;
}]);
Кроме того, это мой HTML-шаблон:
<!DOCTYPE html>
<html ng-app="miApp">
<head>
<meta charset="UTF-8">
<script src="angular.js"></script>
<script src="mainmodule.js"></script>
<link rel="stylesheet" href="bootstrap/css/bootstrap.css">
</head>
<body ng-app="miApp" ng-controller="controlador1">
<button type="button" class="btn btn-default" ng-click="applyFilter()">button</button>
<span ng-repeat="elem in arrayFiltrado">{{elem.name+" "}}</span>
</body>
</html>
Я хочу применить/деактивировать фильтр, когда я нажимаю кнопку, но независимо от того, что я делаю, если я нажму кнопку, в HTML ничего не отображается. Это похоже на то, что массив стирается.
Может ли кто-нибудь сказать мне, что мне здесь не хватает?
Для этого вы можете использовать только угловое связывание. Это позволяет избежать большого количества кода на вашем контроллере и упростить логику.
JS
app.controller('controlador1', ["filterFilter", "$scope", function(filterFilter, $scope) {
$scope.active = false;
$scope.arrayFiltrado = [
{name: 'Tobias'},
{name: 'Jeff'},
{name: 'Brian'},
{name: 'Igor'},
{name: 'James'},
{name: 'Brad'}
];
$scope.filtering = function(item) {
if(!$scope.active) {
return true;
}
return item.name.indexOf('a') !== -1;
}
}]);
HTML
<body ng-app="miApp" ng-controller="controlador1">
<button type="button" class="btn btn-default" ng-click="active = !active">button</button>
<span ng-repeat="elem in arrayFiltrado | filter:filtering">{{elem.name+" "}}</span>
</body>
Если ваш фильтр работает правильно, вместо этого this.array
вы должны использовать $scope.array
$scope.array = [....];
а также
$scope.arrayFiltrado = filterFilter($scope.array, "a");
$scope.arrayFiltrado = $scope.array;
filterFilter