【问题标题】:How to wait in Angular 7 until DOM changed ready?如何在 Angular 7 中等待 DOM 更改就绪?
【发布时间】:2019-08-21 16:56:27
【问题描述】:

我有一个条目列表。当我单击此类条目时,完成了 HTTP 请求,数据将被加载并显示在表格中。到目前为止一切顺利。

现在我尝试创建一个导出函数来一次输出所有表。抽象的代码如下所示:

this.objectlist.forEach(entry => {

    this.getDataFromHTTP(entry).subscribe(response => {
        tabledata.push(this.getTableDOM());
    })

})

在函数getTableDOM() 中,我执行let table = document.getElementsByClassName(data.classname); 之类的操作。当我单击每个条目时,代码本身就会运行。但它在forEach() 中不起作用。

真正的问题是getTableDOM() 返回一个空的结果,因为DOM 在被调用时还没有准备好。

所以我的问题是:我如何才能等到 DOM 更改完成后再致电 getTableDOM()。或者,也许我实现目标的方法是完全错误的。但如果是这样:否则我该怎么做?

感谢您的帮助! 拉尔斯

【问题讨论】:

  • 你试试`ngAfterViewInit()`
  • ngAfterViewInit() 在初始视图准备就绪后只调用一次。在我的例子中,当我点击导出按钮时,视图被渲染并且ngAfterViewInit()已经被调用了。
  • 您介意在 stackblitz.com 上创建一个演示示例吗?这可以给我们更多的洞察力
  • @ShashankVivek,我想过,但是代码对于演示来说有点太复杂了,简化也不是那么容易。不幸的是!
  • @LarsHagen 为什么不使用承诺来保持加载 DOM 直到收到数据。

标签: angular rxjs


【解决方案1】:

请查看我创建的DEMO,希望它能让您朝着正确的方向前进。就像其他人从您提供的内容中提到的那样,很难全面了解。我认为您正在寻找类似OnChanges 的东西,我在下面包含了相关的示例代码。我还在演示中包含了一个 forkJoin 示例。

import {
  Component,
  Input,
  OnChanges,
  SimpleChanges
} from '@angular/core';

@Component({
  selector: 'on-change',
  template: `
        <pre>
            {{changes | json}}
        </pre>
    `
})
export class OnChangeComponent implements OnChanges {
  @Input() data: any;
  changes;
  constructor() {}

  ngOnChanges(changes: SimpleChanges) {
    this.changes = changes;
  }
}

【讨论】:

  • 这是我从未想过的有趣方法。我会试一试。请您提供Demo的完整源代码。我想看看你如何使用forkjoin。我只能“看到”工作示例。
  • @LarsHagen 只需单击“演示”一词,即可带您进入完整演示。您可以充分互动的地方
  • 我做到了。发生的情况是打开了一个正在运行演示的白屏 - 并且只有演示。但是没有可见的源代码。
  • 我将在接下来的几天内测试您的方法(在我必须出差之前)。如果它有效,我肯定会这样做。
【解决方案2】:

您不应该像现在这样使用 DOM 作为数据源。无论如何,您可以手动检测更改以呈现 DOM,并在下一个选项卡中导出内容。

constructor(private changeDetector : ChangeDetectorRef) {}

this.objectlist.forEach(entry => {
    this.getDataFromHTTP(entry).subscribe(response => {
        this.changeDetector.detectChanges();//if using push stratagy
        setTimeout(_=>tabledata.push(this.getTableDOM()));
    })
})

同时检查this问题

您可以标记您的表格并使用viewChildren 访问它们

@ViewChildren("mytable") mytable;

this.mytable.changes.subscribe((el)=>{
    /*check if desired table node exists on el*/
});

【讨论】:

    【解决方案3】:

    这将每 2 秒检查一次 ...

    public static void AngWait(){
        WebDriverWait jsWait jsExec = (JavascriptExecutor) driver;
        String angular5Check = (String) jsExec.executeScript("return getAllAngularRootElements()[0].attributes['ng-version'].value");
        System.out.println(angular5Check);
        if (angular5Check != null) {
            do {
                angularPageLoaded = (Boolean) jsExec.executeScript("return window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1");
                System.out.println("in loop => "+angularPageLoaded);
                Thread.sleep(2000);
    
            } while (!angularPageLoaded);
    
            System.out.println("outside loop => "+angularPageLoaded);
        }
    
    }
    

    【讨论】:

    • 跟WebDriver有什么关系? oO
    • 当网页正在加载时,角度等待将继续每 2 秒检查一次加载器是否正在滚动。一旦加载器消失,它将假定下一个页面/事件准备好了。
    猜你喜欢
    • 2014-03-29
    • 2015-04-12
    • 2022-10-23
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多