ngOnInit
выполняется, когда ваш компонент инициализирован, и ваш getCurrentMovie()
наверняка вернет undefined
, поскольку значение еще не установлено.Позже, когда вы устанавливаете значение, ваш getCurrentMovie
метод не вызывается, либо вы принудительно вызываете его, либо выбираете Behavior Subject
. Я бы предложил вам перейти на RxJS BehaviorSubject
Вы также можете использовать обычную RxJS Subject услугу, но вот некоторые ее преимущества по сравнению с subject
.
- Он всегда будет возвращать текущее значение при подписке - нет необходимости вызывать
onnext().
- . Имеет функцию getValue () для извлечения последнего значения в виде необработанных данных.
- Это гарантирует, чтокомпонент всегда получает самые последние данные.
- Вы можете получить наблюдаемое от субъекта поведения, используя метод
asobservable()
для субъекта поведения. - См. это для получения дополнительной информации
ваш сервис
import { Injectable } from '@angular/core';
import {Imovie} from './imovie'
import {Observable,of,BehaviorSubject} from 'rxjs';
@Injectable()
export class ShareDataService {
private Movie= new BehaviorSubject<Imovie>(null);
currentMovie = this.Movie.asObservable();
constructor() { }
setCurrentMovie(movie:Imovie)
{
this.Movie.next(movie);
}
}
Компонент-1
import { Component, Input } from '@angular/core';
import {ShareDataService} from './share-data.service'
import {Imovie} from './imovie'
@Component({
selector: 'hello',
template: `<div *ngIf="currentMovie">
<h2>{{currentMovie.name}}</h2>
<h2>{{currentMovie.genre}}</h2>
</div>`,
styles: [`h1 { font-family: Lato; }`]
})
export class HelloComponent {
public currentMovie:Imovie;
constructor(public service:ShareDataService)
{
this.service.currentMovie.subscribe((value)=>{this.currentMovie=value
console.log(this.currentMovie);
});
}
}
Компонент-2
import { Component } from '@angular/core';
import {ShareDataService} from './share-data.service'
import {Imovie} from './imovie';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
public movie:Imovie
constructor(public service:ShareDataService)
{
}
setMovie()
{
this.movie={name:'grudge',genre:'horror'};
this.service.setCurrentMovie(this.movie);
}
}
Компонент-2 HTML
<button (click)="setMovie()" >SetMovie</button>
<hello></hello>
LIVE DEMO