我在 Angular 应用程序中有几个导航按钮。我要做的是删除第一页上的“Prev”和最后一页上的“Next”。
我要做的就是设置两个布尔值,说明它是第一页还是最后一页。
麻烦的是我还没有设法理解这些subscribers
和behaviours
.
我可以创建一个计算最后一页的函数,totalItems
所以itemsPerPage
请不要担心,我只是不知道如何从这个订阅中调用一个函数。
如果有人可以请告诉我如何编写回调或其他任何需要这样做的东西,我将永远感激不尽。
组件.html:
<div class="pagination-panel clearfix">
<button (click)="previousPage()" *ngIf="firstPage != true">Prev</button>
<button (click)="nextPage()" *ngIf="lastPage != true">Next</button>
</div>
<!-- How the data is used, if that helps -->
<h2 class="spray-header">Presenters</h2>
<article *ngFor="let presenter of (presenters$ | async)?.data" class="presenter-item">
<div class="presenters-header">
<h3 class="presenters-title margin-none">
<a [routerLink]="['/presenters', presenter.id]">{{presenter.name | uppercase}}</a>
</h3>
<p class="presenters-details">{{presenter.details}}</p>
</div>
<img src="{{presenter.small_thumb}}" class="presenters-profile-picture profile-picture">
</article>
组件.ts
import {Component, OnInit, Inject} from '@angular/core';
import {Http} from "@angular/http";
import "rxjs/add/operator/map";
import {BehaviorSubject} from "rxjs/BehaviorSubject";
import {ActivatedRoute, Router} from "@angular/router";
export class PresentersComponent implements OnInit {
firstPage = true;
lastPage = false;
presenters$ = new BehaviorSubject([
{
data: {
id: 0,
name: "Loading...",
details: "Loading...",
small_thumb: "",
radio_shows: []
},
currentPage: 1,
itemsPerPage: 0,
totalItems: 0
}
]);
constructor(@Inject('api') private api,
private colorService: ColorService,
private http: Http,
private route: ActivatedRoute,
private router: Router) {
route.params
.map((p: any) => p.page)
.switchMap(page => http.get(api + '/presenters?page=' + page))
.map(res => res.json())
.subscribe(this.presenters$);
}
}
更新 1
像这样的东西可以吗?
console.log(x);
似乎给了我正确的数据,但现在我的(presenters$ | async)?.data
东西都没有工作。
.subscribe(
function (x) {
console.log(x);
this.presenters$ = x;
},
null,
function () {
console.log("set the values here");
}
);
更新 2
上面的中断是因为this
引用了函数调用(duh!),但是在尝试使用胖箭头时出现错误,有人知道我在这里做错了什么吗?
.subscribe(
x => this.presenters$ = x,
null,
function () {
console.log("set the values here");
}
);
以上不会抛出错误,但仍然async
无法正常工作。
下面抛出此错误:“错误:InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'”
.subscribe(res => {
this.presenters$ = res;
// Any other lines here.
});
根据下面的链接,看起来我只需要删除异步管道,稍后再试一试。Angular 4:InvalidPipeArgument:管道“AsyncPipe”的“[object Object]”
更新 3
通过从模板中的数据调用中删除异步管道,(presenters$ | async)?.data"
我克服了上次更新中的错误并设法获得了我在开发环境中工作后的功能。
// component.html change
(presenters$)?.data
// latest subscribe that I have working, sort of
.subscribe(res => {
this.presenters$ = res
// got extras lines of code working here
});
现在的问题是它无法编译用于生产。当我尝试编译时,出现此错误:
ng:///var/www/html/io->radio/src/app/presenters/views/presenters.component.html (2,1) 中的错误:“行为主题”类型上不存在属性>“数据” { 数据:{ id:号码;>名称:字符串;详细信息:字符串;小拇指:字符串;radio_s ...'。
更新 4
我开始认为我在这里完全是个垃圾,这BehaviorSubject
不是我应该使用的。我要做的就是从我的 API 调用数据并将其映射到一个对象,如果有人能告诉我我在这里做错了什么,那将是一个很大的帮助。
我认为我的问题是由于对 BehaviorSubject 的不当使用以及对异步管道缺乏了解造成的。
我的下一步是尝试来自@DeborrahK 的非常明智的建议,并创建一个用于检索数据的服务。