Angular 영웅 튜토리얼 5
17655 단어 AngularTypeScript
서비스
서비스는 데이터를 검색하고 구성 요소에 제공하는 부분입니다.
서비스 만들기
터미널$ cd src/app
$ ng generate service hero
hero.service.ts
및 hero.service.spec.ts
가 생성됩니다.hero.service.ts
에서 데이터를 처리합니다.
데이터 검색
자동으로 생성된 코드에 약간 추가합니다.
hero.service.tsimport { Injectable } from '@angular/core';
//以下2行でヒーロー情報の型とデータをインポート
import {Hero} from './hero';
import {HEROES} from './mock-heroes';
@Injectable({
providedIn: 'root'
})
export class HeroService {
constructor() { }
getHeroes(): Hero[]{ //ヒーローのデータを返す関数を定義
return HEROES;
}
}
hero 컴포넌트 수정
hero 컴포넌트에서 데이터를 가져오고 있었습니다만, 서비스로부터 제공해 주므로 컴퍼넌트에서는 데이터 대신에 서비스를 임포트합니다.
hero.component.tsimport { Component, OnInit } from '@angular/core';
import {Hero} from '../hero';
import {HeroService} from '../hero.service';//サービスをインポート
@Component({
selector: 'app-heroes',
templateUrl: './heroes.component.html',
styleUrls: ['./heroes.component.css']
})
export class HeroesComponent implements OnInit {
heroes: Hero[];//宣言を変更
selectedHero: Hero;
//サービスをインポートしたらコンストラクタで宣言する
constructor(private heroService: HeroService) { }
ngOnInit() {//ここで関数を呼び出す
this.getHeroes();//下で作る関数を呼び出す
}
onSelect(hero: Hero): void {
this.selectedHero = hero;
}
getHeroes(): void{//取得したデータを代入する関数を定義
this.heroes = this.heroService.getHeroes();
}
}
여러가지 변경하고 있습니다만, 서비스로부터 데이터를 취득해 컴퍼넌트에서 사용할 수 있도록(듯이) 하고 있습니다.
Observable 사용
이대로 서버에서 데이터를 검색할 때 작동하지 않습니다.
이런 경우에도 작동하도록 ts 파일을 변경합니다. (비동기 기술)
hero.service.tsimport { Injectable } from '@angular/core';
import {Hero} from './hero';
import {HEROES} from './mock-heroes';
import {Observable, of} from 'rxjs'//ここを追加
@Injectable({
providedIn: 'root'
})
export class HeroService {
constructor() { }
getHeroes(): Observable<Hero[]>{//ここを変更
return of(HEROES);
}
}
함수의 반환 값과 형식을 변경했습니다. 이렇게하면 서버에서 데이터를 검색하는 데 시간이 걸릴 때까지 기다립니다. 여기에서 형식을 변경했으므로 hero.component.ts
도 변경해야 합니다.
hero.component.ts getHeroes(): void{//変更した関数
this.heroService.getHeroes().subscribe(
heroes => this.heroes = heroes
);
}
이제 솔직히 모르겠네요. 지금은 어리석은 정도로 좋다고 생각합니다. 이제 지금까지 그대로 작동합니다.
메시지 표시
데이터를 얻을 수 있을 때 메시지를 출력하도록 합니다.
이번 메세지를 출력시키는 message 컴퍼넌트에 가세해, 「데이터 취득과의 첨부·메시지를 기억・컴퍼넌트에 건네준다」의 역할을 하는 message 서비스의 2개를 작성합니다.
터미널$ cd src/app
$ ng generate component message
$ ng generate service message
다음으로 출력할 위치를 html로 하단으로 설정합니다.
app.component.html<h1>{{title}}</h1>
<app-heroes></app-heroes>
<app-message></app-message>
서비스에서 메시지를 추가하고 지우는 함수를 정의합니다.
message.service.tsimport { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class MessageService {
messages: string[] = [];//メッセージを代入する変数を定義
constructor() { }
add(message:string){//引数のmessageをmessagesにpushで代入
this.messages.push(message);
}
clear(){//messagesの中身を空にする
this.messages = [];
}
}
여기에서 만든 함수를 hero.service.ts
에서 사용합니다.
hero.service.tsimport { Injectable } from '@angular/core';
import {Hero} from './hero';
import {HEROES} from './mock-heroes';
import {Observable, of} from 'rxjs';
import {MessageService} from './message.service';//サービスをインポート
@Injectable({
providedIn: 'root'
})
export class HeroService {
//サービスをインポートしたのでコンストラクタでサービスを宣言
constructor(private messageService: MessageService) { }
getHeroes(): Observable<Hero[]>{
//データを取得したらメッセージを代入
this.messageService.add('HeroService: fetched heroes');
return of(HEROES);
}
}
여기에 대입된 messages 를 message 컴퍼넌트에 건네줍니다.
message.component.tsimport { Component, OnInit } from '@angular/core';
import { MessageService } from '../message.service';//サービスをインポート
@Component({
selector: 'app-message',
templateUrl: './message.component.html',
styleUrls: ['./message.component.css']
})
export class MessageComponent implements OnInit {
//サービスをインポートしたのでコンストラクタでサービスを宣言
constructor(public messageService: MessageService) { }
ngOnInit() {
}
}
이번에는 계약자에서 서비스 선언을 public
로 했으므로, message 컴퍼넌트내에서 서비스를 사용할 수 있습니다. 그것을 이용하여 HTML을 작성합니다.
message.component.html<div *ngIf="messageService.messages.length">
<h2>Messages</h2>
<button class="clear"
(click)="messageService.clear()">clear</button>
<div *ngFor='let message of messageService.messages'> {{message}} </div>
</div>
이렇게 메시지가 출력됩니다.
Reference
이 문제에 관하여(Angular 영웅 튜토리얼 5), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kanpeipei/items/d510d085bc3c7b34091f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ cd src/app
$ ng generate service hero
import { Injectable } from '@angular/core';
//以下2行でヒーロー情報の型とデータをインポート
import {Hero} from './hero';
import {HEROES} from './mock-heroes';
@Injectable({
providedIn: 'root'
})
export class HeroService {
constructor() { }
getHeroes(): Hero[]{ //ヒーローのデータを返す関数を定義
return HEROES;
}
}
import { Component, OnInit } from '@angular/core';
import {Hero} from '../hero';
import {HeroService} from '../hero.service';//サービスをインポート
@Component({
selector: 'app-heroes',
templateUrl: './heroes.component.html',
styleUrls: ['./heroes.component.css']
})
export class HeroesComponent implements OnInit {
heroes: Hero[];//宣言を変更
selectedHero: Hero;
//サービスをインポートしたらコンストラクタで宣言する
constructor(private heroService: HeroService) { }
ngOnInit() {//ここで関数を呼び出す
this.getHeroes();//下で作る関数を呼び出す
}
onSelect(hero: Hero): void {
this.selectedHero = hero;
}
getHeroes(): void{//取得したデータを代入する関数を定義
this.heroes = this.heroService.getHeroes();
}
}
import { Injectable } from '@angular/core';
import {Hero} from './hero';
import {HEROES} from './mock-heroes';
import {Observable, of} from 'rxjs'//ここを追加
@Injectable({
providedIn: 'root'
})
export class HeroService {
constructor() { }
getHeroes(): Observable<Hero[]>{//ここを変更
return of(HEROES);
}
}
getHeroes(): void{//変更した関数
this.heroService.getHeroes().subscribe(
heroes => this.heroes = heroes
);
}
$ cd src/app
$ ng generate component message
$ ng generate service message
<h1>{{title}}</h1>
<app-heroes></app-heroes>
<app-message></app-message>
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class MessageService {
messages: string[] = [];//メッセージを代入する変数を定義
constructor() { }
add(message:string){//引数のmessageをmessagesにpushで代入
this.messages.push(message);
}
clear(){//messagesの中身を空にする
this.messages = [];
}
}
import { Injectable } from '@angular/core';
import {Hero} from './hero';
import {HEROES} from './mock-heroes';
import {Observable, of} from 'rxjs';
import {MessageService} from './message.service';//サービスをインポート
@Injectable({
providedIn: 'root'
})
export class HeroService {
//サービスをインポートしたのでコンストラクタでサービスを宣言
constructor(private messageService: MessageService) { }
getHeroes(): Observable<Hero[]>{
//データを取得したらメッセージを代入
this.messageService.add('HeroService: fetched heroes');
return of(HEROES);
}
}
import { Component, OnInit } from '@angular/core';
import { MessageService } from '../message.service';//サービスをインポート
@Component({
selector: 'app-message',
templateUrl: './message.component.html',
styleUrls: ['./message.component.css']
})
export class MessageComponent implements OnInit {
//サービスをインポートしたのでコンストラクタでサービスを宣言
constructor(public messageService: MessageService) { }
ngOnInit() {
}
}
<div *ngIf="messageService.messages.length">
<h2>Messages</h2>
<button class="clear"
(click)="messageService.clear()">clear</button>
<div *ngFor='let message of messageService.messages'> {{message}} </div>
</div>
Reference
이 문제에 관하여(Angular 영웅 튜토리얼 5), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kanpeipei/items/d510d085bc3c7b34091f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)