Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.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
Angularjs Angular2在console.log之后显示订阅_Angularjs_Angular_Observable - Fatal编程技术网

Angularjs Angular2在console.log之后显示订阅

Angularjs Angular2在console.log之后显示订阅,angularjs,angular,observable,Angularjs,Angular,Observable,我有不同的问题 我将数据从服务检索到变量中,但在加载后,这些数据不会显示在屏幕上(我使用订阅进行此操作)。当我使用函数getMessages(){console.log(this.messages);} 你能解释一下原因吗 import {Component, NgZone, OnInit} from '@angular/core'; import {GmailApiService} from "../google/api/gmailApi.service"; import {Subscript

我有不同的问题

我将数据从服务检索到变量中,但在加载后,这些数据不会显示在屏幕上(我使用订阅进行此操作)。当我使用函数
getMessages(){console.log(this.messages);}

你能解释一下原因吗

import {Component, NgZone, OnInit} from '@angular/core';
import {GmailApiService} from "../google/api/gmailApi.service";
import {Subscription} from "rxjs/Rx";


@Component({
    selector: 'gmail-app',
    templateUrl: '/app/gmail/gmail.component.html'
})

export class GmailComponent  implements OnInit{
    public messages: Array<string>;
    subscription:Subscription;

    constructor(private gmailApi: GmailApiService){
    }

    ngOnInit() {
        this.gmailApi.checkAuthAuto('from:(xyz@zyx.com) OR to:(azx@saa.com)');

        this.subscription = this.gmailApi.openMessages$
            .subscribe(messages => this.messages = messages);
    }

    getMessages(){
        console.log(this.messages);
    }

    ngOnDestroy() {
        this.subscription.unsubscribe();
    }
}

我认为这可能与生命周期挂钩有关。见此:

我不确定,但也许你应该实现doCheck和在subscribe中调用ngDoCheck方法?大概是这样的:

export class GmailComponent  implements OnInit, DoCheck {
    public messages: Array<string>;
    subscription:Subscription;

    constructor(private gmailApi: GmailApiService){
    }

    ngOnInit() {
        this.gmailApi.checkAuthAuto('from:(xyz@zyx.com) OR to: (azx@saa.com)');

        this.subscription = this.gmailApi.openMessages$
                .subscribe(messages => { 
                     this.messages = messages;
                     ngDoCheck();
                  });
    }

    getMessages(){
        console.log(this.messages);
    }

    ngOnDestroy() {
         this.subscription.unsubscribe();
    }

    ngDoCheck() {
        //do nothing, just call
    }
}
导出类Gmail组件实现OnInit、DoCheck{
公共消息:数组;
认购:认购;
构造函数(专用gmailApi:GmailApiService){
}
恩戈尼尼特(){
this.gmailApi.checkAuthAuto('from:(xyz@zyx.com)或:(azx@saa.com)');
this.subscription=this.gmailApi.openMessages$
.subscribe(消息=>{
this.messages=消息;
ngDoCheck();
});
}
getMessages(){
console.log(this.messages);
}
恩贡德斯特罗(){
this.subscription.unsubscripte();
}
ngDoCheck(){
//什么都不做,打电话就行了
}
}

它不起作用。我将console.log添加到ngDoCheck()中,但它没有帮助。我认为在我的服务中真正有数据之前,这个订阅中的所有内容都被调用了。我在ngDoCheck()中得到了大约10个consol.log测试,但所有这些测试都是在console.log表单服务之前进行的(使用我的数据)。也许我写错了钩子,对不起,错了。我找到了解决这个问题的办法——这部分与你的建议有关。订阅后Angular2不会触发任何ngDoCheck()方法。当我尝试手动添加它时(如您的示例中),它不起作用。我正在寻找另一种触发此刷新方法的解决方案,当我在文章中的subscription ng2 start trigger refresh check方法中添加zone.run()时,我发现了它,现在它可以正常工作了。谢谢你的帮助!我在我的问题中提出了解决方案。我无法解释,我在许多地方使用相同的模式,而且它是有效的。你能在plunker中复制吗?
constructor(private zone:NgZone, private gmailApi: GmailApiService){
}

ngOnInit() {
    this.gmailApi.checkAuthAuto('from:(xyz@zyx.com) OR to:(azx@saa.com)');

    this.subscription = this.gmailApi.openMessages$
        .subscribe(messages => {
            this.zone.run(() => {
                this.messages = messages;
            });
        });
}
export class GmailComponent  implements OnInit, DoCheck {
    public messages: Array<string>;
    subscription:Subscription;

    constructor(private gmailApi: GmailApiService){
    }

    ngOnInit() {
        this.gmailApi.checkAuthAuto('from:(xyz@zyx.com) OR to: (azx@saa.com)');

        this.subscription = this.gmailApi.openMessages$
                .subscribe(messages => { 
                     this.messages = messages;
                     ngDoCheck();
                  });
    }

    getMessages(){
        console.log(this.messages);
    }

    ngOnDestroy() {
         this.subscription.unsubscribe();
    }

    ngDoCheck() {
        //do nothing, just call
    }
}