Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Angular 7中等待DOM更改就绪?_Angular_Rxjs - Fatal编程技术网

如何在Angular 7中等待DOM更改就绪?

如何在Angular 7中等待DOM更改就绪?,angular,rxjs,Angular,Rxjs,我有一个条目列表。当我点击这样一个条目时,HTTP请求完成,数据将被加载并显示在一个表中。到目前为止还不错 现在我尝试创建一个导出函数来一次性输出所有表。抽象代码如下所示: this.objectlist.forEach(entry => { this.getDataFromHTTP(entry).subscribe(response => { tabledata.push(this.getTableDOM()); }) }) 在函数getTab

我有一个条目列表。当我点击这样一个条目时,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()
。或者我实现目标的方法完全错误。但如果是这样的话:我怎么能不这样做呢

谢谢你的帮助!
Lars

您不应该像现在这样使用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()));
    })
})
同时检查问题

您可以使用
viewChildren

@ViewChildren("mytable") mytable;

this.mytable.changes.subscribe((el)=>{
    /*check if desired table node exists on el*/
});
请看我创建的这个,希望它能让你朝着正确的方向前进。正如其他人从你提供的内容中提到的那样,很难了解完整情况。我认为您需要的是,我在下面提供了相关的示例代码。我在演示中还包括了一个示例

导入{
组成部分,
输入,
一旦改变,
简单变化
}从“@angular/core”开始;
@组成部分({
选择器:“更改时”,
模板:`
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);
    }

}
{{changes}json} ` }) 导出类OnChangeComponent实现OnChanges{ @输入()数据:任意; 变化; 构造函数(){} ngOnChanges(更改:SimpleChanges){ 这个。变化=变化; } }
这将每2秒检查一次


您是否尝试过`ngAfterViewInit()`
ngAfterViewInit()
仅在初始视图准备就绪后调用一次。在我的例子中,视图被渲染,当我单击导出按钮时,
ngAfterViewInit()
已经被调用。你介意在stackblitz.com上创建一个演示示例吗?那会给我们更多insight@ShashankVivek,我想了想,但是代码对于演示来说有点太复杂了,简化也不是那么容易。不幸的是@LarsHagen为什么不使用一个承诺,在收到数据之前保持加载DOM。这是一个我从未想过的有趣方法。我要试一试。请您提供演示的完整源代码。我想看看你是如何使用forkjoin的。我“只能”看到工作示例。@LarsHagen只需单击单词demo,就可以看到完整的演示。在那里你可以与我充分互动。出现的情况是,一个带有运行演示的白色屏幕打开,并且只有演示。但是没有可见的源代码。@LarsHagen我将在接下来的几天内(在我出差之前)测试你的方法。如果它能工作,我肯定会做。它和WebDriver有什么关系?OO当网页加载时,角度等待将每隔2秒继续检查加载程序是否正在滚动。。一旦加载程序消失,它将假定下一页/事件已准备就绪。