小编Dal*_*lie的帖子

combineLatest 组合或合并 Observables 的替代方法

一开始我的印象combineLast是很合适,但是当我阅读文档时,它似乎不是:“请注意,combineLatest在每个可观察对象发出至少一个值之前,它不会发出初始值。”......当然我正好碰到那个异常。我试着forkJoinmerge不同的组合,但我不能得到它的权利。

用例非常简单,该方法someObs返回一个0或更多的可观察对象,我在其上循环。基于SomeObs对象上的一个值,我将一个新构造的 observable 推入OtherObs[]一个Arrayof Observable<OtherObs[]>。这个数组“需要”被合并成一个单一的 observable,在返回它之前我想做一些转换。

具体来说,我很难用combineLast合适的东西替换操作员……

public obs(start: string, end: string): Observable<Array<OtherObs>> {
  return this.someObs().pipe(
    mergeMap((someObs: SomeObs[]) => {
      let othObs: Array<Observable<OtherObs[]>> = [];

      someObs.forEach((sobs: SomeObs) => {
        othObs.push(this.yetAnotherObs(sobs));
      });

      return combineLatest<Event[]>(othObs).pipe(
        map(arr => arr.reduce((acc, cur) => acc.concat(cur)))
      );
    })
  );
}

private yetAnotherObs(): Observable<OtherObs[]> {
  /// ...
}

private somObs(): Observable<SomeObs[]> {
  /// ...
}
Run Code Online (Sandbox Code Playgroud)

merge observable rxjs

7
推荐指数
1
解决办法
9667
查看次数

如何在 Angular 7 中设置 CdkVirtualScrollViewport 的初始索引(位置)

我需要的初始位置cdk-virtual-scroll-viewport不是列表的第一个元素/项目。

现在我找到了scrollToIndexscrollTo方法,但我只能在 中使用它时才能让它们工作ngAfterViewChecked,这感觉不对。

  1. 有人可以确认使用这些方法ngAfterViewChecked是正确的做事方式吗?
  2. 如果没有,请展示替代方法/技术?

  @ViewChild(CdkVirtualScrollViewport) cdkVirtualScrollViewport: CdkVirtualScrollViewport;
  numbers: number[] = [];

  constructor() {
    for (let index = 0; index < 10000; index++) {
      this.numbers.push(index);
    }
  }

  ngAfterViewChecked() {
    this.cdkVirtualScrollViewport.scrollToIndex(2000);
  }
Run Code Online (Sandbox Code Playgroud)
  <ul class="list">
    <cdk-virtual-scroll-viewport style="height:264px" itemSize="88">
      <ng-container *cdkVirtualFor="let n of numbers">
        <li style="height:88px">{{ n }}</li>
      </ng-container>
    </cdk-virtual-scroll-viewport>
  </ul>
Run Code Online (Sandbox Code Playgroud)

lifecycle angular virtualscroll angular-cdk angular7

7
推荐指数
1
解决办法
1751
查看次数

如何避免“框架分离”错误异步验证或使用 Puppeteer 进行重定向?

之前的答案为我指明了方向,即如何捕获异步验证错误或重定向。但在我的场景中, aniframe开始发挥作用,它让我整天忙碌。一些指向正确方向的指针会非常有帮助,因为我无法做到正确,尽管错误清楚地说明了哪里出了问题。

场景的:

  1. 输入留空。在 iframe 内单击按钮,异步请求返回验证错误
  2. 输入有一个值。单击 iframe 内的按钮,用户将被重定向到显示“yaay”的页面。

第二种情况中抛出的错误指出waitForFunction failed: frame got detached。这是有道理的,因为框架不再存在......我发现了,frame.isDetached()但仍然不断抛出相同的错误。我缺少什么或者如何使用此方法使其发挥作用?

let frame = (await page.frames())[0];
...
for (let action of actions) {
    if (action.type === '...') {
        // ...
    }

    if (action.type === 'click') {
        frame.click("#btn");        

        // works for scenario 1 
        await Promise.race([
            page.waitForNavigation({ waitUntil: "networkidle2" }),
            // ERROR THROWN HERE FOR SCENARIO 2
            // `waitForFunction failed: frame got detached`

            // the line below doesn't seem to work …
Run Code Online (Sandbox Code Playgroud)

javascript iframe puppeteer

7
推荐指数
0
解决办法
9236
查看次数

如何在 Angular 4.3+ 中全局设置 { observe: 'response' } 选项?

第一个想法是使用 anHttpInterceptorclone(...)方法的签名不包含该observe选项。除了定义{ observe: 'response' }为每个请求的选择,我没有看到另一种尚未...

那么,是否有(如果有的话)全局设置{ observe: 'response' }选项的方法,例如通过?HttpInterceptor

clone(update: {
   headers?: HttpHeaders;
   reportProgress?: boolean;
   params?: HttpParams;
   responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
   withCredentials?: boolean;
   body?: T | null;
   method?: string;
   url?: string;
   setHeaders?: {
       [name: string]: string | string[];
   };
   setParams?: {
       [param: string]: string;
   };
}): HttpRequest<T>;
Run Code Online (Sandbox Code Playgroud)

response interceptor angular

6
推荐指数
1
解决办法
1608
查看次数