2017-02-10 15 views
0

Я пытаюсь изменить изображение кнопки src И направлять пользователя на другую страницу при нажатии. Вот что я пробовал.Угловая 2 Нажмите Событие: Измените изображение, затем измените маршрут

home.component.html

<button class="hexagon" 
     (click)="gotoFinishing()"> 
    <img [src]="imgsrc"> 
</button> 

home.component.ts

import { Component, OnInit } from '@angular/core'; 
import { ActivatedRoute, Router } from '@angular/router'; 

@Component({ 
    templateUrl: 'home.component.html' 
}) 
export class HomeComponent { 

    constructor(private router: Router) { } 

    imgsrc="test.png"; 

    gotoFinishing(){ 
     this.imgsrc="test2.png"; 
     let link = ['/finishing']; 
     this.router.navigate(link); 
    } 
} 

Это не меняет СРК изображения, но это не прокладывайте пользователя на нужную страницу , Есть ли способ сделать это?

Спасибо!

+2

Как узнать, изменилось ли изображение, так как вы мгновенно удаляетесь от компонента при изменении изображения? Что еще может изменить изображение в вашем домашнем компоненте, если вы отходите от этого компонента? :) – Alex

+0

@ AJT_82 Это не позволит мне публиковать изображения, иначе я покажу вам цель. У нас есть два изображения (1) Шестиугольник с тенью и (2) Шестиугольник без тени. Мы пытаемся щелкнуть нажатием кнопки нажатием кнопки при нажатии, а затем перейдите на страницу. Имеет ли это смысл? Если есть лучший способ, который я готов попробовать, но поскольку кнопка является шестиугольником, это сложно. – JessySue

+0

Ну, это не сработает, так как 'goToFinishing' меняет изображение и маршруты в сторону от компонента, новое изображение не успевает отобразить перед тем, как вы удаляетесь :) – Alex

ответ

1

Это «не меняется», потому что, как только вы переходите к другому пути на маршрутизаторе, старый вид уничтожается, и, таким образом, все состояние теряется.

Вам необходимо отделить состояние своего приложения, чтобы сохранить изменения в определенных представлениях. Для этого вам нужно создать поставщика для отслеживания состояния приложения, ввести его в представления/компоненты, которые вам нужно использовать для включения состояния, а в ссылке шаблона - соответствующая переменная состояния внутри поставщика.

Пример:

app.provider.ts

@Injectable() 
export class AppProvider { 
    public state = { 
     Home: { 
      imgsrc: 'test.png 
     } 
    }; 
} 

home.component.ts

import { Component, OnInit } from '@angular/core'; 
import { ActivatedRoute, Router } from '@angular/router'; 
import { AppProvider } from './app.provider.ts'; 

@Component({ 
    templateUrl: 'home.component.html' 
}) 
export class HomeComponent { 
    constructor(
      private router: Router, 
      public appProvider: AppProvider 
    ) { } 

    gotoFinishing(){ 
     this.appProvider.state.Home.imgsrc="test2.png"; 

     setTimeout(() => { 
      this.router.navigate(['/finishing']); 
     }, 1000); 
    } 
} 

home.component.html

<button class="hexagon" (click)="gotoFinishing()"> 
    <img [src]="appProvider.state.HomeComponent.imgsrc"> 
</button> 

Обязательно импортируйте и добавьте класс AppProvider в объявления вашего @NgModule, чтобы инъекция зависимости могла работать.

Надеюсь, это поможет.


ОБНОВЛЕНО ОТВЕТ: Добавлена ​​задержка на изменение маршрутизации таким образом, изменение изображения можно увидеть в первую очередь.

+0

Спасибо за помощь. Однако он по-прежнему маршрутизируется на страницу _before_, вы видите изменение изображения. – JessySue

+0

См. Мой обновленный ответ, в котором в изменение маршрутизации была добавлена ​​1-секундная задержка, поэтому пользователь может сначала увидеть изменение изображения. – ablopez

+0

Спасибо! Вчера я попытался «setTimeout», и это сработало. – JessySue