数据更改时角度视图不更新

时间:2018-05-11 20:06:17

标签: angular angular2-nativescript

正在使用带有Angular的NativeScript使用Firebase插件处理聊天应用程序。 我使用firebase事件监听器来监听路径上的更改,如下所示:

firebase.addValueEventListener( (result) => {
  for(var key in result.value){
    this.posts.push(result.value[key].Message);
  }
  this.messages = this.posts;
  //am using this.messges to update the view
  this.posts=[];


  }, '/forum/messages');
}

问题是,当我从我的终端发送消息时,视图会更新,但当有人从他们的末尾发送消息时,消息数组会更改,但除非我重新启动应用程序,否则我看不到它。 可能导致这种情况的原因。

1 个答案:

答案 0 :(得分:1)

当你监听firebase事件监听器时,它会在角度区域之外运行你的代码。所以基本上你需要在NgZone里为你的变量赋值。

ChangeDetectionRef的帮助下,使用cd.detectChanges()保证成功反映变化,强制运行changeDetection循环。但你可能不需要这样做。这样做zone.run不能单独工作。

例如

import {
    NgZone,
    ChangeDetectorRef
} from "@angular/core";
@Component({
    selector: "Home",
    moduleId: module.id,
    templateUrl: "./home.component.html",
    styleUrls: ["./home-common.css", "./home.css"]
})
export class HomeComponent{
    messages=[];
    constructor(
        private cd: ChangeDetectorRef,
        private zone: NgZone
    ) {
        firebase.addValueEventListener( (result) => {


          for(var key in result.value){
            this.posts.push(result.value[key].Message);
          }
          this.zone.run(() => {
              this.messages = this.posts;
              this.cd.detectChanges();
          })

          //am using this.messges to update the view
          this.posts=[];


          }, '/forum/messages');
        }
    }
}