【问题标题】:Angular2: view is not updated from inside a subscriptionAngular2:视图未从订阅内部更新
【发布时间】:2016-08-29 22:44:05
【问题描述】:

我有一个订阅服务的简单 angular2 (rc1) 组件。当服务更新订阅时,我可以在组件的订阅中记录结果,但视图没有更新。

我最初的怀疑是我的内部this 没有绑定到外部,但是我在subscribe 回调上使用了一个粗箭头,并且还在第一行尝试了旧的let self = this构造函数,然后执行self.SuccessMessage = result 无济于事。

我必须以某种方式强制更改检测吗?这是我的组件:

import {Component} from 'angular2/core';
import {Subscription} from 'rxjs/Subscription';

import {UploaderService} from './uploader.service';

@Component({
  selector: 'aoma-uploader-status-mini',
  providers: [],
  viewProviders: [],
  templateUrl: './app/uploader/mini-uploader-status.component.html'
})
export class MiniUploadStatusComponent {
  subscription:Subscription;
  successMessage:any = {};

  constructor(private _uploaderService: UploaderService) {
    // view correctly shows this value:
    this.successMessage.serverMessage = 'before ';
    this.subscription = _uploaderService.fileSuccess$.subscribe(result => {
        // this fires and logs the result correctly:
        console.log('the mini uploader: type of result', result);
        // view is never updated here
        this.successMessage = result;
      })
  }

}

目前我的视图中只有{{ successMessage | json }}。它再次正确显示“之前”值,但在订阅获取结果对象时不会改变。

【问题讨论】:

  • 如何在模板中显示消息?

标签: angular


【解决方案1】:

看起来_uploaderService 在 Angulars 区域之外运行。当值从其区域之外更改时,Angular 不会检测到更改。

要使代码在区域内运行,请使用

  constructor(private _uploaderService: UploaderService, private zone:NgZone) {
    // view correctly shows this value:
    this.successMessage.serverMessage = 'before ';
    this.subscription = _uploaderService.fileSuccess$.subscribe(result => {
        // this fires and logs the result correctly:
        console.log('the mini uploader: type of result', result);
        // view is never updated here

        this.zone.run(() => this.successMessage = result);
      })
  }

还有其他方法可以将更改通知 Angular Manual Change Detection in AngularJS or Angular 2?

如果在区域外调用router.navigate() 时运行其他代码,则只有zone.run(...) 可以正确解决问题 - 除非有办法让您的服务首先在 Angulars 区域内运行。

【讨论】:

  • 如果这没有帮助,则需要更多信息,例如显示您如何绑定到successMessage 的模板部分。
  • 感谢您的回答;我已更新问题以显示我的模板内容。不幸的是 zone.run(...) 没有工作。我想我应该看看ChangeDetectionStrategy?当然,如果你有一个很好的例子;-)。
  • 如果zone.run没有解决,问题是由其他原因引起的。你能把console.log('the mini uploader: type of result', result.json()); 打印的内容发布到控制台吗?
  • 它打印的是我希望的,这是一个带有服务器响应的对象:the mini uploader: type of result object Object {file: ResumableFile, serverMessage: "Thank you for uploading to the server."}
  • 当你将这个静态添加到successMessage 时,它会显示吗?这很奇怪。一切看起来都很好......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 2016-04-08
  • 2016-12-06
相关资源
最近更新 更多