아래에서 작성한 프로젝트 이어서 작업
ng generate service service/app
ng generate component user/user-info/user-info-detail
AppModule ├── (AppService) │ ├── HomeModule │ └── UserModule │ └── UserInfoComponent │ └── UserInofDetailComponent
- 유저 정보를 각각
UserComponent
,UserInfoCoponent
,UserInfoDetailCoponent
에서 표시하고 싶은 경우
User
관련 메소드를User
클래스에서 관리한다.UserComponent
에서User
정보를 가져오고 자식컴포넌트들에게 바인딩한다.
UserComponent
# user/user.component.ts export class UserComponent implements OnInit { user: User = new User(this.http); constructor(private http: HttpClient) {} ngOnInit(): void { this.user.get_user(); } }
# user/user.component.html <h1>User Component</h1> <p *ngIf="user">{{ user.id }}</p> <app-user-info [user]="user"></app-user-info>
UserInfoComponent
# user/user-info/user-info.component.ts export class UserInfoComponent { @Input() user?: User; }
# user/user-info/user-info.component.html <h1>User Info Component</h1> <p *ngIf="user">{{ user.username }}</p> <app-user-info-detail [user]="user"></app-user-info-detail>
UserInfoDetailComponent
# user/user-info/user-info-detail/user-info-detail.component.ts export class UserInfoDetailComponent { @Input() user?: User; }
# user/user-info/user-info-detail/user-info-detail.component.html <h1>User Info Detail Component!</h1> <p *ngIf="user">{{ user.created_at }}</p>
문제점
- 컴포넌트의 종속관계가 깊어질수록
User
프로퍼티 바인딩(@Input
)를 계속 진행해야한다.- 하위 컴포넌트에서
User
데이터를 변화시켜 상위 컴포넌트까지 이벤트 바인딩(@Output
)를 해야한다면 더욱 복잡해진다.- 프로퍼티로 전달하거나 매개변수로 사용한
User
객체의 메소드는 사용할 수 없다.
AppService
- 종속관계에 상관없이 직접적으로 접근할 수 있는
AppService
를 만들고AppService
에서User
데이터를 관리한다.User
에 관한 메소드도AppService
에서 관리한다.
@SkipSelf
AppService
는AppComponent
에 제공하지만 하위 컴포넌트에서도@SkipSelf
를 통해AppComponent
가 제공받은AppService
를 바라볼 수 있다.
AppComponent
# app.component.ts @Component({ selector: 'app-root', providers: [AppService], templateUrl: './app.component.html', styleUrls: ['./app.component.css'], }) export class AppComponent implements OnInit { title = 'App Component'; constructor(@Self() public appServic: AppService) {} ngOnInit(): void {} }
UserComponent
# user/user.component.ts export class UserComponent implements OnInit { constructor(@SkipSelf() public appService: AppService) {} ngOnInit(): void {} }
# user/user.component.html <h1>User Component</h1> <p>{{ this.appService.user.id }}</p> <app-user-info></app-user-info>
UserInfoComponent
# user/user-info/user-info.component.ts export class UserInfoComponent implements OnInit { constructor(@SkipSelf() public appService: AppService) {} ngOnInit(): void {} }
# user/user-info/user-info.component.html <h1>User Info Component</h1> <p>{{ this.appService.user.username }}</p> <app-user-info-detail></app-user-info-detail>
UserInfoDetailComponent
# user/user-info/user-info-detail/user-info-detail.component.ts export class UserInfoDetailComponent implements OnInit { constructor(@SkipSelf() public appService: AppService) {} ngOnInit(): void {} }
# user/user-info/user-info-detail/user-info-detail.component.html <h1>User Info Detail Component!</h1> <p>{{ this.appService.user.created_at }}</p>
구현 코드
참고