我需要一些帮助。我有一个主页和一个收藏夹页面(另一个组件(在主页中,用户输入一个电影列表,在该列表中显示2个按钮(Delete和fav(我的问题最严重我希望当我按下收藏夹按钮时,它会将其添加到收藏夹列表中,当我转到收藏夹页面时,它将显示收藏夹列表。
你能帮我吗?我是网络编程的新手。
我的家组件.ts:
import { Component } from '@angular/core';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent {
/* Un tableau vide dans lequel vont être ajoutés les entrées.*/
public films = [];
public favorites = [];
/* Ajout des élèments en entrée dans la liste avec vérification que le texte n'est pas vide.*/
public newFilm;
public addToList() {
if (this.newFilm == '') {
}
else {
this.films.push(this.newFilm);
this.newFilm = '';
}
}
/*Fonction permettant l'ajout d'un element à la liste des favoris*/
public addtofav(index){
this.favorites.push(this.newFilm);
}
/*Fonction permettant la suppression d'une élement de la liste des films et de favoris*/
public deleteTask(index) {
this.films.splice(index, 1);
this.favorites.splice(index, 1);
}
}
My home.component.html:
<div class="row bg-dark justify-content-center
align-items-center" style="height:100px">
<div class="col-5"></div>
<div class="col-6 text-white h2">
Home Page
</div>
</div>
<!--Bloc s'occupant des inputs -->
<div class="row mt-1" style="height:80px;">
<div class="col-3 d-none col-md-3 d-md-block"></div>
<div class="col-12 col-md-6 bg-dark d-flex
justify-content-center align-items-center
text-light h3">
<input [(ngModel)]="newFilm" type="text"
value="" class="col-7 form-control"
style="width:300px;">
<div class="col-1"></div>
<button (click)="addToList()"
class="btn btn-light text-danger">
Ajoutez un film
</button>
</div>
<div class="col-3 d-none col-md-3 d-md-block"></div>
</div>
<!--Bloc s'occupant de la liste des films-->
<div *ngFor="let x of films; let index = index;"
class="row mt-1" style="height:100px;">
<div class="col-3 d-none col-md-3 d-md-block"></div>
<div class="col-12 col-md-6 bg-dark d-flex
justify-content-center align-items-center
text-light h3">
<div class="col-8 text-light h3">{{x}}</div>
<input (click)="deleteTask(index)" type="button"
value="Delete" class="col-2 btn btn-danger">
<input (click)="addtofav(index)" type = "button"
value="Fav" class = "col-2 btn btn-success">
</div>
<div class="col-3 d-none col-md-3 d-md-block"></div>
</div>
</div>
`
我正在扩展Mike S.的答案。
如果零部件处于父子关系,则可以在零部件之间共享数据。您还可以使用服务在它们之间共享数据。
在您的情况下,最好提供一个带有可观察阵列的服务,您的收藏夹组件可以订阅该阵列,以便获得收藏夹列表。
服务:
@Injectable()
export class SharedService {
constructor() { }
//you need to have an existing array in order to assing it to an observable one
//since you cant directly push to ovbservable arrays
private favouritesSource: string[] = [];
favourites: Subject<string[]> = new Subject();
addToFavourites(film: string){
this.favouritesSource.push(film);
this.favourites.next(this.favouritesSource);
}
}
最受欢迎的组件:
export class FavouritesComponent implements OnInit {
constructor(private sharedService: SharedService) { }
favourites: string[];
ngOnInit() {
//assigning the array from the service to the one that displays the favourites
this.sharedService.favourites.subscribe(favourites => {
this.favourites = favourites;
})
}
}
电影部分:
export class MoviesComponent {
constructor(private sharedService: SharedService) { }
addToFavourites(film: string){
this.sharedService.addToFavourites(film);
}
}
我希望这能有所帮助:(
编辑
只有当两个组件同时显示时,这种方法才会起作用,这意味着使用这种方法进行路由将不起作用。
这是因为当您使用angulars路由器进行导航并使用router-outlet
显示组件时,将重新加载正在显示的组件。这意味着ngOnInit()
方法被再次调用,随后也被调用可观测的.subscribe()
方法。
问题是,.subscribe()
内部的语句只在可观测值发生变化时才会触发,并且由于没有加载能够引发可观测值变化的组件,因此.subscribe()
内部的语句不会触发。
编辑2
如果你必须使用angulars路由器在两个组件之间导航,下面是一个例子。
服务:
@Injectable()
export class SharedService {
constructor() { }
private favourites: string[] = [];
addToFavourites(film: string){
this.favourites.push(film);
}
getFavourites(){
return this.favourites;
}
}
电影部分:
xport class MoviesComponent {
constructor(private sharedService: SharedService) { }
addToFavourites(film: string){
this.sharedService.addToFavourites(film);
}
}
最受欢迎的组件:
constructor(private sharedService: SharedService) { }
favourites: string[];
ngOnInit() {
this.favourites = this.sharedService.getFavourites();
}
}
导航可以这样发生:
constructor (private router: Router){}
this.router.navigate(['urlToNavigateTo']);
或者这个:
<anyHtmlElement routerLink="/urlToNavigateTo">Navigate to url</anyHtmlElement>
Stackblitz示例