Angular 에서 검색 키워드 하 이 라이트 예제 구현

Angular 에 서 는 DOM 의 내용 을 직접 수정 하려 고 하지 말 아야 합 니 다.DOM 내용 을 업데이트 해 야 할 때 수정 해 야 할 것 은 사실 우리 의 데이터 모델,즉$scope 의 데이터 입 니 다.Angular 는 수 정 된 데 이 터 를 페이지 에 보 여 주 는 데 도움 을 줄 것 입 니 다.
그러나 어떤 경우 에는 검색 상자 가 있 습 니 다.검색 키 워드 를 본문 에서 밝 히 고 싶 을 때 힘 들 어 집 니 다.filter 는 이러한 상황 을 처리 하 는 데 도움 을 줄 수 있 습 니 다.
실제로 우리 의 데 이 터 는 DOM 에 직접 출력 할 수 없 는 경우 가 많 습 니 다.전형 적 인 날짜 나 화폐 등 은 보통 우리 내부 의 데 이 터 를 포맷 한 후에 페이지 에 출력 해 야 합 니 다.Angular 에서 이 작업 은 filter 를 통 해 실 현 된 것 입 니 다.
filter 는 module 등급 의 서비스 로 정 의 된 후에 전체 module 에서 직접 사용 할 수 있 고 매우 높 은 재 활용 성 을 가진다.
문 제 를 설명 하기 위해 먼저 돌 이 켜 본AngularJs(7)필터 들 어가 기(filter)필 터 를 설명 한 다음 검색 키워드 하 이 라 이 트 를 어떻게 처리 하 는 지 상세 하 게 설명 한다.사용자 정의 필터 부분 부터 시작 할 수 있 습 니 다.
1.필터 사용법
1.템 플 릿 에서 사용
{{}}에서 filter 를 직접 사용 할 수 있 습 니 다.표현 식 뒤에|로 나 눌 수 있 습 니 다.문법 은 다음 과 같 습 니 다.

{{ expression | filter }}
여러 개의 filter 를 연결 할 수도 있 습 니 다.이전 filter 의 출력 은 다음 filter 의 입력 으로 사 용 됩 니 다.

{{ expression | filter1 | filter2 | ... }}
filter 는 파 라 메 터 를 받 을 수 있 습 니 다.파 라 메 터 는:분리 할 수 있 습 니 다.

{{ expression | filter:argument1:argument2:... }}
{{}}의 데 이 터 를 포맷 하 는 것 외 에 도 명령 에 filter 를 사용 할 수 있 습 니 다.예 를 들 어 배열 array 를 필터 처리 한 다음 에 반복 해서 출력 할 수 있 습 니 다.

<span ng-repeat="a in array | filter ">
2.controller 와 service 에서 사용
우리 의 js 코드 에서 도 필 터 를 사용 할 수 있 습 니 다.방식 은 바로 우리 가 익숙 한 의존 주입 입 니 다.예 를 들 어 저 는 contrller 에서 currency 필 터 를 사용 하려 면 이 contrller 에 주입 하면 됩 니 다.

app.controller('testC',function($scope,currencyFilter){
  $scope.num = currencyFilter(123534); 
}
템 플 릿 에{{{num}}을 사용 하면$123,534.00 을 직접 출력 할 수 있 습 니 다!서비스 에서 filter 를 사용 하 는 것 도 마찬가지다.
이때 당신 은 의심 이 있 을 수 있 습 니 다.만약 에 제 가 controller 에서 여러 개의 filter 를 사용 하려 면 하나씩 주입 해 야 합 니까?이것 은 너무 힘 들 지 않 습 니까?동생 조급해 하지 마 세 요~ng 은 필요 한 filter 를 호출 할 수 있 는$filter 서 비 스 를 제공 합 니 다.$filter 만 주입 하면 됩 니 다.사용 방법 은 다음 과 같 습 니 다.

app.controller('testC',function($scope,$filter){
  $scope.num = $filter('currency')(123534);
  $scope.date = $filter('date')(new Date()); 
}
2.내 장 된 filter
1.currentcy,currency 를 사용 하면 숫자 를 화폐 로 포맷 할 수 있 습 니 다.기본 값 은 달러 기호 입 니 다.필요 한 기 호 를 직접 입력 할 수 있 습 니 다.

{{num | currency : '¥'}}
2.date,원생 js 는 날짜 의 포맷 능력 에 한계 가 있 습 니 다.ng 이 제공 하 는 date 필 터 는 기본적으로 일반적인 포맷 요 구 를 만족 시 킬 수 있 습 니 다.

{{date | date : 'yyyy-MM-dd hh:mm:ss EEEE'}}
3.filter,주의 하 세 요.이 필터 의 이름 은 filter 입 니 다.헷 갈 리 지 마 세 요.하나의 배열 을 처리 한 후에 특정한 키 문자열 을 포함 하 는 요 소 를 걸 러 내 서 하나의 키 배열 로 되 돌 릴 수 있 습 니 다.문자열 배열 일 수도 있 고 대상 배열 일 수도 있 습 니 다.대상 배열 이 라면 속성 값 과 일치 할 수 있 습 니 다.하위 문자열 의 일치 규칙 을 정의 하기 위해 인 자 를 받 습 니 다.

$scope.childrenArray = [
    {name:'kimi',age:3},
    {name:'cindy',age:4},
    {name:'anglar',age:4},
    {name:'shitou',age:6},
    {name:'tiantian',age:5}
  ];
사용자 정의 보조 함수.

$scope.func = function(e){return e.age>4;}
필터 사용

{{ childrenArray | filter : 'a' }} //        a 
{{ childrenArray | filter : 4 }} //        4 
{{ childrenArray | filter : {name : 'i'} }} //     ,  name     i 
{{childrenArray | filter : func }} //     ,    age>4 
4.제 이 슨,제 이 슨 대상 포맷.json 필 터 는 js 대상 을 json 문자열 로 포맷 할 수 있 습 니 다.역할 은 우리 가 잘 아 는 JSON.stringify()와 같다.

{{ jsonTest | json}}
5.limito,limito 필 터 는 배열 이나 문자열 을 캡 처 하 는 데 사용 되 며,캡 처 길 이 를 지정 하 는 매개 변 수 를 받 습 니 다.배열 이나 문자열 의 시작 에서 만 캡 처 할 수 있 습 니 다.

{{ childrenArray | limitTo : 2 }} //           
6.lowercase,소문 자로 변환.데 이 터 를 모든 소문 자로 바꾸다.
7.uppercase,대문자 로 변환.
8.number,숫자 포맷.number 필 터 는 하나의 숫자 에 천 자리 분할 을 더 할 수 있 습 니 다.이렇게 123,456,789.동시에 하나의 인 자 를 받 으 면 작은 float 형식 을 지정 하여 몇 개의 소 수 를 유지 할 수 있 습 니 다.

{{ num | number : 2 }}
9.orderby 정렬,orderby 필 터 는 한 배열 의 요 소 를 정렬 할 수 있 습 니 다.하나의 매개 변 수 를 받 아 정렬 규칙 을 지정 할 수 있 습 니 다.매개 변 수 는 문자열 로 이 속성 이름 으로 정렬 할 수 있 습 니 다.하나의 함수 로 정렬 속성 을 정의 할 수 있 습 니 다.또한 하나의 배열 일 수 있 습 니 다.배열 의 속성 값 에 따라 정렬 하 는 것 을 표시 합 니 다(첫 번 째 항목 에 따라 비교 하 는 값 이 같 으 면 두 번 째 항목 에 따라 비교 합 니 다).

<div>{{ childrenArray | orderBy : 'age' }}</div>   // age       
<div>{{ childrenArray | orderBy : orderFunc }}</div>  //            
<div>{{ childrenArray | orderBy : ['age','name'] }}</div> //  age  ,  name    
3.사용자 정의 필터
 우 리 는 먼저 인자 가 없 는 필 터 를 정의 합 니 다.첫 번 째 예 는 Angular 공식 문서 에서 나 왔 습 니 다.
우 리 는 데이터 가 사실 인지 확인 하고 싶 습 니 다.만약 사실 이 라면✓로 표시 합 니 다.그렇지 않 으 면 표시 합 니 다.  ✘,유 니 코드 에서\u2713->✓,\u2718->✘,그래서 우리 가 해 야 할 일 은 데이터 가 진짜 인지 확인 한 다음 에 이 두 개의 특수 문자 로 전환 하여 출력 하 는 것 이다.

app.filter('checkmark', function() {
 return function(input) {
  return input ? '\u2713' : '\u2718';
 };
});
필 터 는 내 장 된 필 터 는 화폐 나 날 짜 를 포맷 할 수 있 는 인자 도 있 습 니 다.
필터 뒤에 콜론(:)을 사용 하여 구분 하 는 것 은 필터 의 매개 변수 입 니 다.필터 에서 이 매개 변 수 를 가 져 올 수 있 습 니 다.여러 개의 매개 변수 가 있 으 면 콜론(:)을 계속 사용 하여 구분 할 수 있 기 때문에 필 터 는 여러 개의 매개 변 수 를 가 질 수 있 습 니 다.
긴 문자열 을 자 르 는 필 터 를 구현 합 니 다.

app.filter("truncate", function(){
  return function(text, length){
    if (text) {
      var ellipsis = text.length > length ? "..." : "";
      return text.slice(0, length) + ellipsis;
    };
    return text;    
  }
});
4.하 이 라이트 필터 정의
 우리 가 검색 하고 자 하 는 키 워드 는 본문 에서 밝 혀 집 니 다.본문 은 필터 의 첫 번 째 매개 변수 이 고 두 번 째 매개 변 수 는 검색 키워드 입 니 다.그러면 우리 의 필 터 는 두 개의 매개 변수 가 있 을 것 입 니 다.
하 이 라이트 의 원 리 는 간단 합 니 다.하 이 라이트 가 필요 한 내용 을 span 태그 로 격 리 시 키 고 특수 한 class 를 추가 하여 설명 하면 됩 니 다.

app.filter("highlight", function($sce, $log){

  var fn = function(text, search){
    $log.info("text: " + text);
    $log.info("search: " + search);

    if (!search) {
      return $sce.trustAsHtml(text);
    }
    text = encodeURI(text);
    search = encodeURI(search);

    var regex = new RegExp(search, 'gi')
    var result = text.replace(regex, '<span class="highlightedText">$&</span>');
    result = decodeURI(result);
    $log.info("result: " + result );
    return $sce.trustAsHtml(result);
  };

  return fn;
});

$sce,$log 는 angular 가 제공 하 는 두 가지 서비스 입 니 다.그 중에서$sce 서 비 스 는 사용 해 야 합 니 다.  ngSanitize 모듈.이 모듈 에 대해 서 는 angular-ngSanitize 모듈-$sanitize 서비스 상세 설명 을 참고 할 수 있 습 니 다.
5.서비스 대상 정의
우리 의 페이지 는 매우 복잡 할 수 있 습 니 다.컨트롤 러 에 키 워드 를 입력 해 야 합 니 다.그러나 여러 컨트롤 러 에서 이 키 워드 를 사용 하여 여과 해 야 합 니 다.어떻게 처리 해 야 합 니까?서 비 스 를 이용 하면 이 문 제 를 해결 할 수 있다.
Angular 에서 서 비 스 는 하나의 사례 대상 입 니 다.저 희 는 factory 를 사용 하여 서비스 대상 을 직접 정의 할 수 있 습 니 다.

app.factory("notifyService", function(){
  var target = {
    search:"key"
  };

  return target;
});
이 대상 을 사용 해 야 하 는 곳 에 직접 주입 하면 이 대상 을 얻 을 수 있다.
6.검색 컨트롤 러 정의
검색 컨트롤 러 에서 저 희 는 사용자 가 검색 키 워드 를 제공 하 기 를 바 랍 니 다.검 사 를 편리 하 게 하기 위해 서,우 리 는 가 는 길에 사용자 의 입력 을 보 여 주 었 다.

    <div ng-controller="tools">
      <div>
        <input type="text" ng-model="notify.search" value=""/>
      </div>
      <div>
        {{notify.search}}
      </div>
    </div>
컨트롤 러 의 실현,우 리 는 서비스 대상 을 컨트롤 러 에 직접 주입 한 다음 현재$scope 에 연결 하여 현재 컨트롤 러 에서 연결 할 수 있 도록 합 니 다.

app.controller("tools", function($scope, notifyService){
  $scope.notify = notifyService;
});
현재 검색 키 워드 를 직접 입력 할 수 있 습 니 다.이 키 워드 는 서비스 대상 에 저 장 됩 니 다.현재 module 의 각 컨트롤 러 에서 이 서비스 대상 을 방문 할 수 있 습 니 다.
7.콘 텐 츠 컨트롤 러 에 filter 사용
현재,우 리 는 이미 필터 가 있 고,서비스 대상 을 통 해 검색 키 워드 를 직접 얻 을 수 있 으 며,지금 조합 하면 사용 할 수 있다.text 는 우리 의 본문 내용 입 니 다.

    <div ng-controller="search">
      <div ng-bind-html="text | highlight:notify.search">
      </div>
    </div>
하 이 라이트 와 notify.search 가 어디서 왔 는 지 살 펴 보 자.

app.controller("search", function($scope, $log, notifyService){
  $scope.text = "hello, world. hello, world. hello, world.";
  $scope.notify = notifyService;
})
현재 컨트롤 러 에서 검색 키 워드 를 사용 하기 위해 서 는 검색 키 가 바 뀌 었 을 때 자동 으로 업데이트 하 는 것 이 관건 입 니 다.Google 은 서비스 대상 을 현재$scope 에 연결 합 니 다.이것 은 인 용 된 이름 은 notify 입 니 다.
이렇게 하면 복잡 한 페이지 에서 우 리 는 여러 개의 컨트롤 러 가 존재 할 수 있 습 니 다.하 이 라 이 트 를 필요 로 하 는 모든 컨트롤 러 에서 우 리 는 서비스 대상 을 주입 하면 현재 검색 키 워드 를 직접 얻 을 수 있 고 필 터 를 사용 하면 전체적인 하 이 라 이 트 를 직접 실현 할 수 있 습 니 다.
8.총화
필터 와 서비스 대상 을 결합 하여 우 리 는 복잡 한 페이지 에서 전체 페이지 의 내용 을 키워드 하 이 라 이 트 를 실현 합 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기