2016-08-13 4 views
0

내 응용 프로그램의 각 경로에 대해 부모 배경 이미지를 변경해야합니다. 각 중첩 된 구성 요소에서 스타일 속성을 사용하여이를 달성하고 각 구성 요소의 ViewEncapsulation을 없음으로 설정하여 전체 효과를 얻습니다. 이것은 작동하지만 문제는 내가 응용 프로그램을 탐색, 나는 머리 태그에이 스타일의 여러 인스턴스를 얻고있다 :어떻게 중첩 된 구성 요소의 부모 배경 이미지를 각도 2로 변경할 수 있습니까?

import {Component, Output, EventEmitter} from '@angular/core'; 
import {ViewEncapsulation} from '@angular/core'; 

@Component({ 
    selector: '', 
    templateUrl:'app/home.component.html', 
    styles: [` 
       .hero-unit { 
        background:url('/app/assets/images/hero-01.png'); 
        width:100%; 
        height:540px; 
        background-size: cover; 
        background-repeat: no-repeat; 
        background-position: 50% 50%; 
       } 
      `], 

    encapsulation: ViewEncapsulation.None 
}) 
export class HomeComponent { 

} 
: 여기
<style>...</style> 
<style>...</style> 

이 하위 구성 요소에 대한 코드입니다

One은 다른 페이지를 덮어 쓰기합니다. 이전 페이지로 돌아가서 효과가 작동을 멈추기 전까지는 괜찮습니다. 내 질문은 스타일 속성을 제거하고 해당 구성 요소에서 벗어나서 다시 탐색 할 때 스타일 속성을 다시 삽입하는 방법입니다. 또는 경로를 기반으로 배경 이미지를 바꿀 수있는 더 좋은 방법이 있습니까? Angular 2에서 이러한 간단한 작업을 수행하는 가장 좋은 방법을 찾는 데 어려움을 겪고 있습니다. 고마워요.

+0

시도해보고이를 수행하는 데 사용하는 코드를 보여주십시오. – Soviut

+0

귀하가 시도한 것을 귀하의 접근 방식과 귀하의 결과를 보여주십시오. 간결하게 질문을 표현하면 도움을 줄 수있는 사람을 찾을 수 있습니다. – pixelbits

+0

제안에 감사드립니다. 문제의 코드로 게시물을 수정했습니다. – maximus

답변

2

라우터 데이터 또는 서비스를 사용할 수 있습니다.

라우터 솔루션

경로 데이터에 이미지 URL을 넣어 :

{ path:  'child1', 
    component: Child1Component, 
    data:  { imageUrl: '/app/assets/images/hero-02.png' } 
} 

부모 구성 요소는 다음 경로 이벤트를 구독 URL을 추출하고 스타일 속성을 업데이트 할 수 있습니다

import {Component, Renderer, ElementRef} from '@angular/core'; 
import {Router, ActivatedRoute, NavigationEnd} from '@angular/router'; 

@Component({ 
    template: `<section> 
    UserComponent content here, if any. 
    <nav> 
     <a [routerLink]="['./']">Activity</a> 
     <a [routerLink]="['profile']">Profile</a> 
     - child routes 
    </nav> 
    <div class="child-view"> 
     <router-outlet></router-outlet> 
    </div> 
    <section>` 
}) 
export class UserComponent { 
    constructor(private router: Router, private route: ActivatedRoute, 
    private renderer:Renderer, private elref:ElementRef) {} 
    ngOnInit() { 
    this.router.events 
     .filter(event => event instanceof NavigationEnd) 
     .subscribe(_ => { 
      let childRouteSnapshot = this.route.firstChild.snapshot; 
      let url = childRouteSnapshot.data.imageUrl; 
      this.renderer.setElementStyle(this.elref.nativeElement.childNodes[0], 
      'background-image', 'url(' + url + ')'); 
     }) 
    } 
} 

다음은 작동 중입니다. Plunker. 합니다 (plunker의 코드 중 일부는 RC5로 변환 절반 방법이라고합니다. 위의 코드는 모두 RC5입니다.)

내가 elrefng-component보다는 <section>로 설정되어 있기 때문에 내 예제에서 childNodes[0]을 사용했다.

서비스 솔루션

공유 서비스를 사용합니다. 요리 책 섹션 Parent and children communicate via a service을 참조하십시오. 하위 구성 요소는 상위 구성 요소가 구독하는 관찰 가능/주제에 이벤트 (즉, URL 이미지 문자열)를 게시합니다.

+0

제안 마크를 주셔서 감사합니다. 라우터 데이터 매개 변수가 마음에 들지만 작동하도록 코드를 가져올 수 없습니다. 나는 단순화 된 접근법을 시도하고 정의되지 않은 결과를 얻었다. 다음은 url을 검색하는 데 사용하는 코드입니다. export class AppComponent { imageUrl : string; 생성자 (개인 경로 : ActivatedRoute) { this.imageUrl = route.snapshot.params [ 'imageUrl']; console.log (this.imageUrl); } } – maximus

+0

@maximus, 나는 일하는 Plunker로 대답을 업데이트했다. 데이터가'ActivatedRoute.params'에 없으며'ActivatedRoute.data'에 있습니다. –

+0

그 일을 한 Mark에게 감사드립니다."{[name : string] : any;} '..."내 라우터 경로는 {path :'features ', component : FeaturesComponent, data : {imageUrl : '/app/assets/images/hero-02.png'}}, 이렇게 작동해야합니다. 나는 라우터 구현이 다르다는 것을 알았다. 나는이 방법을 사용하는 사람들의 다른 예를 보지 못했지만 여기에 NgModule 설정 https://angular.io/docs/ts/latest/guide/router.html을 사용했습니다. 어쩌면 이것이 문제의 원인일까요? – maximus