Ich habe eine Filterfunktion geschrieben, die Daten basierend auf dem übergebenen Argument zurückgibt. Ich möchte die gleiche Funktionalität in meinem Controller. Ist es möglich, die Filterfunktion in einer Steuerung wiederzuverwenden?
Das habe ich bisher versucht:
function myCtrl($scope,filter1)
{
// i simply used the filter function name, it is not working.
}
Injizieren Sie $ filter in Ihren Controller
function myCtrl($scope, $filter)
{
}
Wo immer Sie diesen Filter verwenden möchten, verwenden Sie ihn einfach wie folgt:
$filter('filtername');
Wenn Sie diesem Filter Argumente übergeben möchten, verwenden Sie separate Klammern:
function myCtrl($scope, $filter)
{
$filter('filtername')(arg1,arg2);
}
Wobei arg1
das Array ist, nach dem gefiltert werden soll, und arg2
das Objekt ist, nach dem gefiltert wird.
Die Antwort von @Prashanth ist richtig, aber es gibt noch eine einfachere Möglichkeit, dasselbe zu tun. Anstatt die Abhängigkeit $filter
einzuschleusen und umständliche Syntax zum Aufrufen ($filter('filtername')(arg1,arg2);
) zu verwenden, kann man folgende Abhängigkeit einschleusen: Filtername plus das Suffix Filter
.
Nehmen wir ein Beispiel aus der Frage, die man schreiben könnte:
function myCtrl($scope, filter1Filter) {
filter1Filter(input, arg1);
}
Es ist zu beachten, dass Sie Filter
an den Filternamen anhängen müssen, unabhängig davon, welche Namenskonvention Sie verwenden: Auf foo wird verwiesen, indem Sie fooFilter
aufrufen.
fooFilter wird referenziert, indem fooFilterFilter
aufgerufen wird
Mit dem folgenden Beispielcode können wir das Array in angular controller nach Namen filtern. Dies basiert auf der folgenden Beschreibung. http://docs.angularjs.org/guide/filter
this.filteredArray = filterFilter (this.array, {name: 'Igor'});
JS:
angular.module('FilterInControllerModule', []).
controller('FilterController', ['filterFilter', function(filterFilter) {
this.array = [
{name: 'Tobias'},
{name: 'Jeff'},
{name: 'Brian'},
{name: 'Igor'},
{name: 'James'},
{name: 'Brad'}
];
this.filteredArray = filterFilter(this.array, {name:'Igor'});
}]);
HTML
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Example - example-example96-production</title>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.3/angular.min.js"></script>
<script src="script.js"></script>
</head>
<body ng-app="FilterInControllerModule">
<div ng-controller="FilterController as ctrl">
<div>
All entries:
<span ng-repeat="entry in ctrl.array">{{entry.name}} </span>
</div>
<div>
Filter By Name in angular controller
<span ng-repeat="entry in ctrl.filteredArray">{{entry.name}} </span>
</div>
</div>
</body>
</html>
Hier ist ein weiteres Beispiel für die Verwendung von filter
in einem Angular Controller:
$scope.ListOfPeople = [
{ PersonID: 10, FirstName: "John", LastName: "Smith", Sex: "Male" },
{ PersonID: 11, FirstName: "James", LastName: "Last", Sex: "Male" },
{ PersonID: 12, FirstName: "Mary", LastName: "Heart", Sex: "Female" },
{ PersonID: 13, FirstName: "Sandra", LastName: "Goldsmith", Sex: "Female" },
{ PersonID: 14, FirstName: "Shaun", LastName: "Sheep", Sex: "Male" },
{ PersonID: 15, FirstName: "Nicola", LastName: "Smith", Sex: "Male" }
];
$scope.ListOfWomen = $scope.ListOfPeople.filter(function (person) {
return (person.Sex == "Female");
});
// This will display "There are 2 women in our list."
Prompt("", "There are " + $scope.ListOfWomen.length + " women in our list.");
Einfach, hey?
Angenommen, Sie haben den folgenden einfachen Filter, der eine Zeichenfolge in Großbuchstaben umwandelt und einen Parameter nur für das erste Zeichen enthält.
app.filter('uppercase', function() {
return function(string, firstCharOnly) {
return (!firstCharOnly)
? string.toUpperCase()
: string.charAt(0).toUpperCase() + string.slice(1);
}
});
Direkt durch $filter
app.controller('MyController', function($filter) {
// HELLO
var text = $filter('uppercase')('hello');
// Hello
var text = $filter('uppercase')('hello', true);
});
Hinweis: Damit haben Sie Zugriff auf alle Ihre Filter.
Weisen Sie $filter
einem variable
z
Mit dieser Option können Sie den $filter
wie einen function
verwenden.
app.controller('MyController', function($filter) {
var uppercaseFilter = $filter('uppercase');
// HELLO
var text = uppercaseFilter('hello');
// Hello
var text = uppercaseFilter('hello', true);
});
Lade nur ein bestimmtes Filter
Sie können nur einen bestimmten Filter laden, indem Sie den Filternamen mit Filter
anhängen.
app.controller('MyController', function(uppercaseFilter) {
// HELLO
var text = uppercaseFilter('hello');
// Hello
var text = uppercaseFilter('hello', true);
});
Welches Sie verwenden, wird von Ihnen bevorzugt, ich empfehle jedoch das dritte, da es die am besten lesbare Option ist.
function ngController($scope,$filter){
$scope.name = "aaaa";
$scope.age = "32";
$scope.result = function(){
return $filter('lowercase')($scope.name);
};
}
Der Name des zweiten Arguments der Controllermethode sollte "$ filter" lauten, damit nur die Filterfunktionalität mit diesem Beispiel funktioniert. In diesem Beispiel habe ich den "Kleinbuchstaben" -Filter verwendet.
Ich habe ein anderes Beispiel, das ich für meinen Prozess gemacht habe:
Ich erhalte ein Array mit der folgenden Wertebeschreibung
states = [{
status: '1',
desc: '\u2713'
}, {
status: '2',
desc: '\u271B'
}]
in meiner Filters.js:
.filter('getState', function () {
return function (input, states) {
//console.log(states);
for (var i = 0; i < states.length; i++) {
//console.log(states[i]);
if (states[i].status == input) {
return states[i].desc;
}
}
return '\u2718';
};
})
Dann eine Testvariable (Controller):
function myCtrl($scope, $filter) {
// ....
var resp = $filter('getState')('1', states);
// ....
}
Mit AngularJs können Sie Filter innerhalb von Vorlagen oder innerhalb von Controllern, Direktiven usw. verwenden.
in der Vorlage können Sie diese Syntax verwenden
{{ variable | MyFilter: ... : ... }}
und innerhalb des Controllers können Sie den $ -Filterservice verwenden
angular.module('MyModule').controller('MyCtrl',function($scope, $filter){
$filter('MyFilter')(arg1, arg2);
})
Wenn Sie mehr mit Demo-Beispiel benötigen, ist hier ein Link
Es gibt eine andere Möglichkeit, Filter auszuwerten, die die Syntax der Ansichten widerspiegeln. Der Aufruf ist haarig, aber Sie könnten eine Verknüpfung dazu erstellen. Mir gefällt, dass die Syntax der Zeichenfolge mit der einer Ansicht identisch ist. Sieht aus wie das:
function myCtrl($scope, $interpolate) {
$scope.$eval($interpolate( "{{ myvar * 10 | currency }} dollars." ))
}
Es scheint, dass niemand erwähnt hat, dass Sie eine Funktion als arg2 in $ filter ('filtername') (arg1, arg2); verwenden können
Zum Beispiel:
$scope.filteredItems = $filter('filter')(items, function(item){return item.Price>50;});
Ein einfaches Datumsbeispiel für die Verwendung von $ filter in einem Controller wäre:
var myDate = new Date();
$scope.dateAsString = $filter('date')(myDate, "yyyy-MM-dd");
Wie hier erklärt - https://stackoverflow.com/a/20131782/26214
Verwenden Sie den folgenden Code, wenn Sie mehrere Bedingungen anstelle eines einzelnen Werts in Javascript hinzufügen möchten. angular filter:
var modifiedArray = $filter('filter')(array,function(item){return (item.ColumnName == 'Value1' || item.ColumnName == 'Value2');},true)
Zuerst injiziere $ filter in deinen Controller und stelle sicher, dass ngSanitize in deiner App geladen ist. Später wird der Controller wie folgt verwendet:
$filter('linky')(text, target, attributes)
wenn Sie Filterobjekt in der Steuerung verwenden möchten, versuchen Sie dies
var rateSelected = $filter('filter')($scope.GradeList, function (obj) {
if(obj.GradeId == $scope.contractor_emp.save_modal_data.GradeId)
return obj;
});
Dies gibt ein gefiltertes Objekt gemäß falls Bedingung zurück