Я разрабатываю страницу, чтобы показать несколько видеороликов, и они могут понравиться пользователю. Видео и лайки сохраняются в базе данных, и я использовал два сервиса angular для установки и получения данных. Моя проблема - ставить и отзывать лайки на видео. после каждого запроса на установку или отмену подобных роликов данные страницы обновлялись, и загрузка видео расстраивала пользователя. службы работают нормально и наборы данных в базу данных правильно.
Мне просто нужно обновить цвет кнопки и количество лайков на странице. Каково решение проблемы игнорировать обновление ссылок на видео, которая исправлена и никогда не менялась?
Ниже я поместил часть своих кодов:
index.component.html:
<mat-card class = "example-card" *ngFor = "let video of videos">
<mat-card-header>
<mat-card-title>{{ video.title }}</mat-card-title>
<mat-card-subtitle>
{{ video.description }}
</mat-card-subtitle>
</mat-card-header>
<div class = "video-container">
<iframe class = "video-frame" [src] = "video.mediaSource | safe" allowFullScreen = "true" webkitallowfullscreen = "true" mozallowfullscreen = "true" ></iframe>
</div>
<mat-card-actions class = "text-center">
<button *ngIf = "video.isLiked == true" mat-icon-button color = "warn">
<mat-icon (click) = "revokeLike(1, video.id)">favorite</mat-icon>
</button>
<button *ngIf = "video.isLiked == false" mat-icon-button class = "grey_like">
<mat-icon (click) = "setLike(1, video.id)">favorite</mat-icon>
</button>
<span>{{ competition.likesCount }} Likes</span>
</mat-card-actions>
</mat-card>
index.component.ts:
export class ShowComponent implements OnInit {
competitions:any;
constructor(private service:VideoService, private http: HttpClient, private likeservice:LikeService) { }
ngOnInit() {
this.getVideos();
}
getVideos() {
this.service.getVideos(1).subscribe(res => {
this.videos = res;
});
}
setLike(iid, video_id) {
this.likeservice.setLike(iid, video_id).subscribe(
() => this.getCompetitions()
);
}
revokeLike(iid, video_id) {
this.likeservice.revokeLike(iid, video_id).subscribe(
() => this.getCompetitions()
);
}
}
videos.service.ts:
getVideos(id): Observable<any> {
const uri = 'http://localhost:4000/videos/iid/' + id;
return this
.http
.get(uri)
.map(res => {
return res;
});
}
like.service.ts:
setLike(iid, competition_id) {
const uri = 'http://localhost:4000/likes/set';
const obj = {
iid: iid,
competition_id: competition_id
};
return this
.http
.post(uri, obj)
.map(res =>
console.info('Done'));
}
revokeLike(iid, competition_id) {
const uri = 'http://localhost:4000/likes/revoke';
const obj = {
iid: iid,
competition_id: competition_id
};
return this
.http
.post(uri, obj)
.map(res =>
console.info('Done'));
}
Пожалуйста, добавьте функции setLike и revokeLike
@Sravan добавлены две функции!
@Andrew Я хочу обновить модель после того, как мне понравилось видео, так как теперь она работает правильно. но проблема заключается в обновлении модели, обновлении значений в html и обновлении окон iframe для видео мне не подходит.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Судя по информации, я бы сделал так. Идея состоит в том, что нет необходимости запрашивать у серверной части список видео, поскольку вы знаете, что и как изменилось, и вы применяете изменение только в том случае, если у вас есть положительный ответ.
Шаблон:
<mat-card class = "example-card" *ngFor = "let video of videos">
...
<button *ngIf = "video.isLiked == true" mat-icon-button color = "warn">
<mat-icon (click) = "revokeLike(video)">favorite</mat-icon>
</button>
<button *ngIf = "video.isLiked == false" mat-icon-button class = "grey_like">
<mat-icon (click) = "setLike(video)">favorite</mat-icon>
</button>
...
</mat-card>
Контроллер:
export class ShowComponent implements OnInit {
competitions:any;
constructor(private service:VideoService, private http: HttpClient, private likeservice:LikeService) { }
ngOnInit() {
this.getVideos();
}
getVideos() {
this.service.getVideos(1).subscribe(res => {
this.videos = res;
});
}
setLike(video) {
this.likeservice.setLike(1, video.id).subscribe(
() => video.isLiked = true
);
}
revokeLike(video) {
this.likeservice.revokeLike(1, video.id).subscribe(
() => video.isLiked = false
);
}
}
Вы можете сделать это в функциях setLike и revokeLike, отправить video object в function и makeisLiked, чтобы изменить accordingly.
Это заставляет условие *ngIf работать на вас.
HTML:
<mat-card-actions class = "text-center">
<button *ngIf = "video.isLiked == true" mat-icon-button color = "warn">
<mat-icon (click) = "revokeLike(1, video)">favorite</mat-icon>
</button>
<button *ngIf = "video.isLiked == false" mat-icon-button class = "grey_like">
<mat-icon (click) = "setLike(1, video)">favorite</mat-icon>
</button>
<span>{{ competition.likesCount }} Likes</span>
</mat-card-actions>
Составная часть:
setLike(iid, video) {
this.likeservice.setLike(iid, video.id).subscribe(
data => {
video.isLiked = true;
}
);
}
revokeLike(iid, video) {
this.likeservice.revokeLike(iid, video.id).subscribe(
data => {
video.isLiked = false;
}
);
}
Ваш ответ правильный, большое спасибо, но Эндрю ответил за мгновение до вас.
Все в порядке, @MahmoodKohansal, кто бы ни ответил первым, наша цель - помогать людям. :-)
Я не уверен, что точно понимаю, в чем проблема. Вы хотите пропустить создание нового запроса после того, как вам понравилось видео? Почему бы вам не обновить модель напрямую?