2016-08-13 1 views
0

Для каждого маршрута в моем приложении мне нужно изменить исходное фоновое изображение. Я использую свойство style для каждого вложенного компонента для достижения этого, устанавливая ViewEncapsulation в None в каждом компоненте, чтобы он имел глобальный эффект. Это работает, но проблема в том, как я перемещаться через приложение, я получаю несколько экземпляров этого стиля в голову тег:Как вы можете изменить исходное фоновое изображение из вложенного компонента в Angular 2?

<style>...</style> 
<style>...</style> 

Вот код для компонента ребенка:

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 { 

} 

Один переопределяет другое, что нормально, пока вы не попытаетесь вернуться к предыдущей странице, где эффект перестает работать. Мой вопрос в том, есть ли способ удалить свойство стиля, как только я уйду от этого компонента и повторно вставил его, когда вернусь обратно. Альтернативно, есть лучший способ поменять фоновое изображение на основе маршрута. Мне сложно найти лучший метод для достижения такой простой задачи в 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.)

мне пришлось использовать childNodes[0], потому что в моем примере elref был установлен в ng-component, а не <section>.

Сервис решение

Используйте общую службу. См. Раздел «Поваренная книга» Parent and children communicate via a service. Детские компоненты публикуют события (например, строки изображения URL) на наблюдаемом/субъекте, который подписывается родительским компонентом.

+0

Спасибо за предложения Отметить. Мне нравится параметр данных маршрутизатора, но он не может заставить ваш код работать. Я попробовал упрощенный подход и получил возврат неопределенного. Вот код, который я использую для извлечения url: класс экспорта AppComponent { imageUrl: string; конструктор (частный маршрут: ActivatedRoute) { this.imageUrl = route.snapshot.params ['imageUrl']; console.log (this.imageUrl); } } – maximus

+0

@maximus, я обновил ответ рабочим Plunker. Обратите внимание, что данные не находятся в 'ActivatedRoute.params', это находится в' ActivatedRoute.data'. –

+0

Большое спасибо за это.Когда я пытаюсь реализовать этот способ, я получаю «Property» imageUrl 'не существует в типе' {[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

Смежные вопросы