如何重置 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 并通过访问 BehaviourSubjectvalue 属性 在 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);
}