如何重置 msInfiniteScroll 的 BehaviorSuject 值?
How to reset BehaviorSuject values for msInfiniteScroll?
我在此处复制了 Haidar 的示例 (),为应用程序制作无限滚动。我按预期工作,无限滚动调用 getNextBatch() 函数来获取下一个值。但是,我需要在用户单击按钮或其他事件时重置此值。
我正在使用 angular6,这是我的代码:
这是我的 html:
<mat-select msInfiniteScroll (infiniteScroll)="getNextBatch()" placeholder="Select..." [complete]="offset === array.length"
(selectionChange)="setValues($event.value)">
<mat-option [value]="-1"> None</mat-option>
<mat-option *ngFor="let option of options$ | async" [value]="option.ID">
{{option.ID}}
</mat-option>
</mat-select>
我的js文件是:
limit = 10;
offset = 0;
options = new BehaviorSubject<VListaDocAttachEntity[]>([]);
options$: Observable<VListaDocAttachEntity[]>;
constructor(){
this.options$ = this.options.asObservable().pipe(
scan((acc, curr) => {
return [...acc, ...curr];
}, [])
);
}
getNextBatch(noAdvance?: string) {
var result = [];
if (!noAdvance) {//this is the original behavior
result = this.docNums.slice(this.offset, this.offset + this.limit);
this.offset += this.limit;
} else { // this is the optional behavior
var cnt: number = 0;
for (var i = 0; i < this.docNums.length; i++) {
this.documento.forEach(element => {
if(this.docNums[i].Doc == element.DocNum){
cnt++
}
});
if (cnt == 0) {
result.push(this.docNums[i]);
}else{
cnt =0;
}
}
}
this.options.next(result);//this appends to the list more elements
}
当我使用可选行为时,我从原始列表创建一个新列表,删除我已经 selected 的元素,并想在我的 mat-select 中替换以前的值, 以及新过滤的。
但唯一的方法是 next(),它会附加更多元素。所以我想要的是重置这些值,并附加新列表。有办法吗?
追加更多元素的不是next
而是scan
运算符。一种可能的解决方案是删除 scan
并通过访问 BehaviourSubject
的 value
属性 在 getNextBatch
内进行附加,如下所示:
limit = 10;
offset = 0;
options = new BehaviorSubject<VListaDocAttachEntity[]>([]);
options$: Observable<VListaDocAttachEntity[]>;
constructor(){
// CHANGED
this.options$ = this.options.asObservable();
}
getNextBatch(noAdvance?: string) {
var result = [];
if (!noAdvance) {//this is the original behavior
// CHANGED
result = [...this.options.value, ...this.docNums.slice(this.offset, this.offset + this.limit)];
this.offset += this.limit;
} else { // this is the optional behavior
var cnt: number = 0;
for (var i = 0; i < this.docNums.length; i++) {
this.documento.forEach(element => {
if(this.docNums[i].Doc == element.DocNum){
cnt++
}
});
if (cnt == 0) {
result.push(this.docNums[i]);
}else{
cnt =0;
}
}
}
this.options.next(result);
}
我在此处复制了 Haidar 的示例 (
我正在使用 angular6,这是我的代码:
这是我的 html:
<mat-select msInfiniteScroll (infiniteScroll)="getNextBatch()" placeholder="Select..." [complete]="offset === array.length"
(selectionChange)="setValues($event.value)">
<mat-option [value]="-1"> None</mat-option>
<mat-option *ngFor="let option of options$ | async" [value]="option.ID">
{{option.ID}}
</mat-option>
</mat-select>
我的js文件是:
limit = 10;
offset = 0;
options = new BehaviorSubject<VListaDocAttachEntity[]>([]);
options$: Observable<VListaDocAttachEntity[]>;
constructor(){
this.options$ = this.options.asObservable().pipe(
scan((acc, curr) => {
return [...acc, ...curr];
}, [])
);
}
getNextBatch(noAdvance?: string) {
var result = [];
if (!noAdvance) {//this is the original behavior
result = this.docNums.slice(this.offset, this.offset + this.limit);
this.offset += this.limit;
} else { // this is the optional behavior
var cnt: number = 0;
for (var i = 0; i < this.docNums.length; i++) {
this.documento.forEach(element => {
if(this.docNums[i].Doc == element.DocNum){
cnt++
}
});
if (cnt == 0) {
result.push(this.docNums[i]);
}else{
cnt =0;
}
}
}
this.options.next(result);//this appends to the list more elements
}
当我使用可选行为时,我从原始列表创建一个新列表,删除我已经 selected 的元素,并想在我的 mat-select 中替换以前的值, 以及新过滤的。
但唯一的方法是 next(),它会附加更多元素。所以我想要的是重置这些值,并附加新列表。有办法吗?
追加更多元素的不是next
而是scan
运算符。一种可能的解决方案是删除 scan
并通过访问 BehaviourSubject
的 value
属性 在 getNextBatch
内进行附加,如下所示:
limit = 10;
offset = 0;
options = new BehaviorSubject<VListaDocAttachEntity[]>([]);
options$: Observable<VListaDocAttachEntity[]>;
constructor(){
// CHANGED
this.options$ = this.options.asObservable();
}
getNextBatch(noAdvance?: string) {
var result = [];
if (!noAdvance) {//this is the original behavior
// CHANGED
result = [...this.options.value, ...this.docNums.slice(this.offset, this.offset + this.limit)];
this.offset += this.limit;
} else { // this is the optional behavior
var cnt: number = 0;
for (var i = 0; i < this.docNums.length; i++) {
this.documento.forEach(element => {
if(this.docNums[i].Doc == element.DocNum){
cnt++
}
});
if (cnt == 0) {
result.push(this.docNums[i]);
}else{
cnt =0;
}
}
}
this.options.next(result);
}