프레임워크/Ionic2(아이오닉2)

ionic2 페이지 생성

khao 2017. 10. 16. 02:00

-

<ion-nav [root]="rootPage" #content swipeBackEnabled="false"></ion-nav>


src/app/app.html에 들어가면 위와 같은 코드가 있는데, 여기서 주목할 것은 [root]입니다. [root] 프로퍼티는 처음 한 번은 반드시 지정해줘야 하는 프로퍼티로 root-page의 ion-nav 컴포넌트입니다. ion-nav가 로딩되면 이 컴포넌트는 rootPgae 변수값에 따라 참조된 것을 표시합니다.


src/app/app.component.tx를 보면 MyApp 컴포넌트가 생성자를 명시한 것을 보실 수 있습니다.


...
import { HelloIonicPage } from '../pages/hello-ionic/hello-ionic';
...

export class MyApp {
  ...

  // make HelloIonicPage the root (or first) page
  rootPage: any = HelloIonicPage;
  pages: Array<{ title: string, component: any }>;

    constructor(private platform: Platform, private menu: MenuController, ...) {
      ...
    }
  ...
}


이 생성자에서 rootPage 변수가 HelloIonicPage를 가지는데, HelloIonicPage는 처음으로 로딩되는 nav controller가 됩니다.



페이지 생성


페이지를 생성하기 전에, 우리가 import해야 할 HelloIonicPage에 대해 더 알아볼 필요가 있습니다. src/pages/hello-ionic폴더 안에 있는 hello-ionic.ts를 열어봅시다.


import { Component } from '@angular/core';

@Component({
  selector: 'page-hello-ionic',
  templateUrl: 'hello-ionic.html'
})
export class HelloIonicPage {
  constructor() {

  }
}


모든 페이지는 위와 같은 클래스를 가지며 연관된 템플릿 역시 일반적으로 가집니다. 참고로 위의 @Component는 Angular에 관련된 내용인데, 데코레이터입니다. selector는 컴포넌트 이름을, templateUrl은 템플릿(.html)의 경로를 의미합니다. styleUrl도 있긴 한데 이름에서 짐작하듯 .css나 .scss파일을 지정할 때 씁니다. 이 예제에서는 사용하지 않으나 빈 css, scss라도 만들어두는 것이 패턴의 일환으로 볼 때 좋습니다. (예제도 사용하지는 않지만 scss파일은 있습니다) 데코레이터와 클래스를 모두 가진 이 ts파일 하나를 컴포넌트라고 합니다.


<ion-header>
  <ion-navbar>
    <button ion-button menuToggle>
      <ion-icon name="menu"></ion-icon>
    </button>
    <ion-title>Hello Ionic</ion-title>
  </ion-navbar>
</ion-header>


<ion-content padding>

  <h3>Welcome to your first Ionic app!</h3>

  <p>
    This starter project is our way of helping you get a functional app running in record time.
  </p>
  <p>
    Follow along on the tutorial section of the Ionic docs!
  </p>
  <p>
    <button ion-button color="primary" menuToggle>Toggle Menu</button>
  </p>

</ion-content>


다음으로 살펴볼 것은 hello-ionic.html입니다. (같은 폴더에 있습니다)

<ion-navbar>는 이 페이지의 navigation bar(이하 nav)를 위한 템플릿입니다. 만약 이 페이지를 방문하게 되면, 삼 모양 버튼과 제목(Hello Ionic)이

뜨게 될 것입니다.

나머지 태그 부분은 표준 아이오닉2 코드로 컨텐츠 영역을 설정하고 환영 메세지를 표현해주는 부분들입니다.



페이지를 추가해봅시다


src/pages/list/list.ts를 들어가서 새 페이지에 대해 정의합시다.


import {Component} from "@angular/core";
import {NavController, NavParams} from 'ionic-angular';
import {ItemDetailsPage} from '../item-details/item-details';


@Component({
  templateUrl: 'list.html'
})
export class ListPage {
  selectedItem: any;
  icons: string[];
  items: Array<{ title: string, note: string, icon: string }>;

  constructor(public navCtrl: NavController, public navParams: NavParams) {
    // If we navigated to this page, we will have an item available as a nav param
    this.selectedItem = navParams.get('item');

    this.icons = ['flask', 'wifi', 'beer', 'football', 'basketball', 'paper-plane',
      'american-football', 'boat', 'bluetooth', 'build'];

    this.items = [];
    for (let i = 1; i < 11; i++) {
      this.items.push({
        title: 'Item ' + i,
        note: 'This is item #' + i,
        icon: this.icons[Math.floor(Math.random() * this.icons.length)]
      });
    }
  }

  itemTapped(event, item) {
    this.navCtrl.push(ItemDetailsPage, {
      item: item
    });
  }
}


이 페이지에서 반응형 메뉴바를 눌러 My First List페이지로 들어가면 나오는 Item들을 만듭니다. 즉, 실질적인 값들에 대한 컨트롤을 여기서 합니다.

for문에서 열심히 각 요소에 대해 정의를 하고 있네요. 이렇게 만든 item들을 itemTapped(event, item)에서 item에 이벤트가 발생하면 NavController가 ItemDetailsPage와 item을 화면으로 보내줍니다.

그리고 list.html 템플릿을 보면 list.ts에서 구성한 값을 표현합니다.


<ion-header>
<ion-navbar>
<button ion-button menuToggle>
<ion-icon name="menu"></ion-icon>
</button>
<ion-title>My First List</ion-title>
</ion-navbar>
</ion-header>
<ion-content>
<ion-list>
<button ion-item *ngFor="let item of items" (click)="itemTapped($event, item)">
<ion-icon name="{{item.icon}}" item-left></ion-icon>
{{item.title}}
<div class="item-note" item-right>{{item.note}}</div>
</button>

</ion-list>
</ion-content>


list.ts가 list.html의 컴포넌트이기 때문에 (click)="itemTapped($event, item)"처럼 함수도 이벤트에 등록할 수 있습니다.


이런 식으로 컴포넌트와 템플릿을 만들면 페이지를 만들 수 있습니다. 만든 페이지로 이동하기 위해서는 NavController 변수에 표현하고 싶은 페이지와 값을 넣고 클릭 이벤트가 발생할 때 전달하면 되는 것이죠. 정 모르겠다 싶으시면 list.ts와 list.html, item-details.ts와 item-details.html을 보시고 비슷하게 따라하시는 것을 추천드립니다.