Возможно, кому-то набор встроенных фильтров покажется ограниченным. Но разработчики фреймворка предоставляют нам возможность создавать собственные фильтры.
Фильтр по сути представляет функцию, которая выполняется над переданным значением. Ее типизированное представление выглядит следующим образом:
module.filter('filter_name', function(){ return function(param){ // некоторые действия над param return some_value; } })
В этой конструкции module
- название модуля приложения. filter_name
- произвольное название функции фильтра.
Параметр возвращаемой функции - param
- параметр, над которым будут производиться действия. И some_value
-
некоторое возвращаемое значение. В качестве значения может выступать текст самого параметра или какое-то иное значение. Посмотрим на примере.
Для начала создадим модуль в отдельном файле - назовем его app.js и положим в папку js:
var questApp = angular.module('questApp', []);
Затем изменим контроллер QuestionController:
questApp.controller('QuestionController', function QuestionController($scope){ $scope.question={ text: 'Какой js-фреймворк лучше использовать?', author: 'Иван Иванов', date: '20/10/2013', answers: [{ text: 'AngularJS!', author: 'Вова Сидоров', date: '20/10/2013', rate:2 },{ text: 'AngularJS лучше всех', author: 'Олег Кузнецов', date: '21/10/2013', rate:3 },{ text: 'фигасе квестшен', author: 'Неизвестный', date: '22/10/2013', rate:0 }] }, $scope.voteUp = function (answer){ answer.rate++; }; $scope.voteDown = function (answer){ answer.rate--; }; } )
Теперь создадим фильтр. Его задачей будет фильтрация сообщений, и если сообщение содержит некорректное выражение, то его заменяем звездочками. Для этого создадим отдельный файл filter.js в каталоге js со следующим содержанием:
questApp.filter('formatText', function(){ return function(text){ if(text.indexOf("фигасе")!==-1){ return "***"; } else{ return text; } } })
В итоге проект будет выглядеть следующим образом:
И теперь определим html-страницу, где будет происходить все это безобразие:
<!doctype html> <html ng-app="questApp"> <head> <meta charset="utf-8"> <link rel="stylesheet" href="css/mystyles.css" /> </head> <body> <div ng-controller="QuestionController"> <div class="quest"> <h3>{{question.text}}</h3> <p>{{question.author}} </p> <p><i>{{question.date}}</i></p> </div> <h3>Ответы</h3> <div class="answers"> <div ng-repeat="answer in question.answers" class="answer"> <div class="vote"> <a class="vote-up" ng-click="voteUp(answer)"></a> <span class="rate">{{answer.rate}}</span> <a class="vote-down" ng-click="voteDown(answer)"></a> </div> <b>{{answer.text | formatText}}</b> <p>{{answer.author}}</p> <p><i>{{answer.date}}</i></p> </div> </div> </div> <script src="js/lib/angular.min.js"></script> <script src="js/app.js"></script> <script src="js/controllers/QuestionController.js"></script> <script src="js/filter.js"></script> </body> </html>
И поскольку один из ответов к вопросу содержит некорректное слово, то при выводе оно будет заменяться звездочками: