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
}
}