[Angular] history back 기능 구현 : 상세 화면 뒤로가기하여 목록 화면으로 이동 시 검색조건 그대로 보여주기

안녕하세요, 명동섞어찌개입니다.

오늘은 관리자 화면에서 검색 조건을 선택해서 검색 후, 필터링 된 결과물 상세보기를 한 다음 뒤로 돌아갔을 때 기존 검색조건이 그대로 남아있도록 하는 방법에 대해 알아보겠습니다.

말로 하니까 어려운데요;; 아래 화면을 보시면 !!



저 빨간 박스 부분에서 검색 조건을 선택하고, 아래에 필터링 된 결과물 목록 중 하나를 클릭해서 상세 페이지로 갔다가, 다시 목록 페이지로 돌아오면 기존에 선택한 검색 결과가 저장되지 않고 사라지는데요. 그걸 보존하는(?!) 방법을 알아보겠습니다.

구현 방법은.. 저같은 초짜는 localStorage 를 쓸까 cookie 를 쓸까 (.....;;;;) 별 생각을 다 하지만 가장 간단하고 흔하고 안전한 방법은 route 를 이용하는 겁니다

주소창에 뒤에 조건식을 ? 다음에 & 로 구분해서 보존하는 거요. 아래처럼요.

https://devcloud.ipatioplatform.com/admin/cdn/list?inputKey=originalFileName&inputValue=&deletedYn=N&organizationId=1234995959595&taskSystemId=&templateId=&from=2015-04-06&to=2020-04-06&periodKey=created&sortBy=




1. 먼저 저희 쪽 목록 화면이 어떻게 구현되어있는지 간단하게 살펴보겠습니다.

cdn-list.component.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<mat-form-field class="customSelector">
     <mat-label>이용기관</mat-label>
     <mat-select [(value)]="searchParams.organizationId" (selectionChange)="onOrgChange($event)">
           <mat-option value="">전체</mat-option>
           <mat-option *ngFor="let org of organizations" [value]="org.organizationId">
                  {org.organizationName}}
           </mat-option>
      </mat-select>
</mat-form-field>

.
.
.

<mat-form-field class="customSelector">
       <mat-label>삭제여부</mat-label>
       <mat-select [(value)]="searchParams.deletedYn">
              <mat-option *ngFor="let option of CODE.DELETED_YN_SEARCH_OPTIONS" [value]="option.value" >{{option.name}}</mat-option>
       </mat-select>
</mat-form-field>


cdn-list.component.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//각 조건식
class SearchParams {
    inputKey = commonCode.INPUT_SEARCH_CM.FILE_NAME;
    inputValue = '';
    deletedYn = '';
    organizationId = '';
    taskSystemId = '';
    productionYn = null;
    templateId = '';
    from = moment().subtract(1, 'year').format('YYYY-MM-DD');
    to = moment().format('YYYY-MM-DD');
    periodKey = 'created';
    sortBy = '';
}

@Component({
    selector: 'app-cdn-list',
    templateUrl: './cdn-list.component.html',
    styleUrls: ['./cdn-list.component.scss'],
    providers: [ProcessDataService ]
})
export class CdnListComponent implements OnInit {

.
.
.

searchParams = new SearchParams();

getCdnFileList(pagination?: any) {

    const params = {
         processType: '0003',
         from: undefined,
         to: undefined,
         deletedYn: undefined,
         sortBy: undefined,
         organizationId : this.searchParams.organizationId,
         taskSystemId : this.searchParams.taskSystemId,
         templateId : this.searchParams.templateId,
         productionYn : this.searchParams.productionYn,
     };

     //목록 화면 데이터를 읽어온다
     this.processDataService.getProcessDataList(params).subscribe(
     data => {
          this.cdnList = data.result;
     },
     ({error}) => {
                
     }
)


SearchParams 라는 클래스에 변수들을 넣어놓고, 화면에서 검색조건을 선택하면 searchParams 에 값이 연동되어 저장되고, 이 값을 검색할 때 param 에 넣어 보내는 방식이에요.




2. 이제 목록화면에 돌아올 때 url 의 값들을 가지고 검색조건이 남아있게 하는 작업 부분입니다.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
ngOnInit() {

     this.initializeQueryParams();
     
}

initializeQueryParams() { 
 
     this.searchParams = Object.assign(this.searchParams, this.route.snapshot.queryParams);
 }

updateQueryParams() {
     this.router.navigate(
         [],
         {
             relativeTo: this.route,
             queryParams:  this.searchParams,
             queryParamsHandling: 'merge',
         });
}

.
.
.


getCdnFileList(pagination?: any) {

.
.
.

this.processDataService.getProcessDataList(params).subscribe(
         data => {
             this.cdnList = data.result;

             this.updateQueryParams();
         },
         ({error}) => {
         }
     )
}


생각보다 간단합니다.!!
저 위의 getCdnFileList 함수는 검색할 때 마다 호출하는 함수인데요, 검색할 때마다
searchParams 에 url 부분의 파라미터 (route)들을 업데이트('merge') 해주면, url 에 저장된 검색조건들이 searchParams 에 그대로 반영되어 결과 목록에 보여집니다.

https://devcloud.ipatioplatform.com/admin/cdn/list?inputKey=originalFileName&inputValue=&deletedYn=N&organizationId=1234995959595&taskSystemId=&templateId=&from=2015-04-06&to=2020-04-06&periodKey=created&sortBy=

이 부분이요. 그리고 화면을 이동해도 그대로 남아있게 됩니다.


3. Reset 하고 싶다면


1
2
3
4
5
resetSearchParams(){
     this.searchParams = new SearchParams();

     this.updateQueryParams();
}


이렇게 간단하게 초기화할 수 있습니다.



4. 마지막으로 간단한 조치

이 상태로 네비게이션에서 자기 자신의 링크 (route)를 다시 누르게 되면 저 부분이 제대로 작동하지 않게 됩니다.
일반적인 네비게이션이 그렇듯이 해당 페이지에서는, 해당 메뉴를 비활성화 (링크 작동 안되게끔) 처리해두면 문제가 없습니다! 여기까지 처리해주셔야 쓸 수 있는 기능입니다.


















댓글

주간 인기글

남산 케이블카 이야기

Kotlin, Java 그 다음?

[정보] 인스타그램은 당신의 소리를 '듣고' 있을 수도 있습니다

[Angular] 모델, 값이 바뀌었는데 화면 template 이 업데이트 되지 않을 때 조치 팁

안드로이드에서 당겨서 새로고침(SwipeRefreshLayout) 쉽게 구현하기