Angular 4 视图也未从服务中更新

布莱斯凯布尔

我正在努力解决我的视图未从服务更新的问题。

我想要实现的是消息处理。我向服务发送消息并且订阅的组件得到更新。在模型上,一切正常,但视图根本没有改变。

我的服务:

import {Injectable} from '@angular/core';
import {Observer} from 'rxjs/Observer';
import {Subscription} from 'rxjs/Subscription';
import {Subject} from 'rxjs/Rx';

import {MyMessage} from './myMessage';

@Injectable()
export class MessageHandlingService {
    private _message: Subject<MyMessage> = new Subject();

    handle(message: string, stack: string) {
        // console.log('handle', message, stack);
        let newMyMessage: MyMessage;

        if (stack) {
            newMyMessage = new MyMessage(2, message, stack);
        } else {
            newMyMessage = new MyMessage(1, message, stack);
        }

        this._message.next(newMyMessage);
    }

    subscribeMessages(observer: Observer<MyMessage>): Subscription {
        // console.log('MessageHandling - subscriber accepted');
        return this._message.subscribe(observer);
    }
}

我的组件:

import {Component, OnInit, OnDestroy} from '@angular/core';
import {Observer} from 'rxjs/Observer';
import {Subscription} from 'rxjs/Subscription';

import {MessageHandlingService} from './messageHandling.service';
import {MyMessage} from './myMessage';

@Component({
    templateUrl: './my-messager.component.html',
    selector: 'mymy-messager'
})
export class MyMessagerComponent implements OnInit, OnDestroy, Observer<MyMessage> {

    private _subscription: Subscription;

    display: boolean = false;

    msg: MyMessage = null;

    constructor(private messageHandling: MessageHandlingService) {}

    ngOnInit() {
        console.log('MyMessager is subscribing');
        this._subscription = this.messageHandling.subscribeMessages(this);
    }

    ngOnDestroy() {
        console.log('MyMessager is UN-subscribing');
        if (this._subscription) {
            this._subscription.unsubscribe();
        }
    }

    /* istanbul ignore next */
    complete() {}

    /* istanbul ignore next */
    error(e: any) {
        if (console) {
            console.error(e);
        }
    }

    next(message: MyMessage) {
        console.log('observed next', message);
        this._showMessage(message);
    }

    private _showMessage(message: MyMessage) {
        this.msg = message;
        console.log('Settind display to true')
        this.display = true;
    }

    hideDialog() {
        this.msg = null;
        this.display = false;
    }
}

和组件 HTML

{{msg}}
{{display}}
<span *ngIf="msg">
    <span *ngIf="msg.severity === 1">
        <p-dialog 
            header="Information message"
            [(visible)]="display" 
            modal="modal"
            showEffect="fade">
            <p>{{msg.message}}</p>
            <footer>
                <div
                    class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix">
                    <button type="button" pButton icon="fa-close" (click)="hideDialog()" label="OK"></button>
                </div>
            </footer> 
        </p-dialog>
    </span>
    <span *ngIf="msg.severity === 2">
        <p-dialog 
            header="Technical message"
            [(visible)]="display" 
            modal="modal"
            showEffect="fade">
            <p>{{msg.message}}</p>
            <br />
            <hr />
            <p style="white-space: pre;">{{msg.stackTrace}}</p>
            <footer>
                <div
                    class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix">
                    <button type="button" pButton icon="fa-close" (click)="hideDialog()" label="OK"></button>
                </div>
            </footer> 
        </p-dialog>
    </span>
</span>

我试过了

ChangeDetectorRef.detectChanges()

ChangeDetectorRef.markForCheck()

ApplicationRef.tick()

乃至

NgZone run

但没有运气。相同的代码适用于 Angular 2。

yurzui

this._message.subscribe(observer);执行期间SafeSubscriber 正在创建

function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {
    _super.call(this);
    this._parentSubscriber = _parentSubscriber;
    var next;
    var context = this;
    if (isFunction_1.isFunction(observerOrNext)) {
        next = observerOrNext;
    }
    else if (observerOrNext) {
        next = observerOrNext.next;
        error = observerOrNext.error;
        complete = observerOrNext.complete;
        if (observerOrNext !== Observer_1.empty) {
            context = Object.create(observerOrNext); // this line

所以你失去了当前AppComponent实例的链接

在此处输入图片说明

在此处输入图片说明

例如,这应该适合你

subscribeMessages(observer: Observer<MyMessage>): Subscription {
  const subscriber = new Subscriber(
      observer.next.bind(observer),
      observer.error.bind(observer),
      observer.complete.bind(observer))

  return this._message.subscribe(subscriber);
}

或者你可以使用像这样的对象

const subscriber = {
   next: observer.next.bind(observer),
   error: observer.error.bind(observer),
   complete: observer.complete.bind(observer))
}

Plunker 示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

服务中的Angular JS Promise不更新视图

来自分类Dev

Angular2中的视图未更新

来自分类Dev

从Angular中的@Input更新ngOnChanges的视图

来自分类Dev

订阅不会更新Angular中的视图

来自分类Dev

服务中的Angular JS Promise不更新视图

来自分类Dev

在间隔中更新angular.js视图

来自分类Dev

angular-我在视图中有一个元素绑定到服务中的变量,但是在更新服务时视图没有得到更新

来自分类Dev

Angular2:视图未从Socket.io事件更新

来自分类Dev

Angular 2 - 在服务中定义的变量,不在视图中更新

来自分类Dev

响应式表单 Angular 4 中的输入字段未更新

来自分类Dev

Angular 4 中的模态形式

来自分类Dev

Angular 2/4:无法更新子组件视图

来自分类Dev

在 Angular 4 中更新服务数据

来自分类Dev

Angular 4 公共服务的位置

来自分类Dev

SB-Admin-BS4-Angular-4 ,添加服务

来自分类Dev

angular4 订阅网络服务

来自分类Dev

Angular 4 - 跨组件动态更新内容

来自分类Dev

Angular 4 服务构造函数错误

来自分类Dev

在 Angular 4 中迭代对象

来自分类Dev

Angular 4 Enum 不在列表中更新

来自分类Dev

来自服务和视图的 Angular 4 更新数组

来自分类Dev

创建后 Angular 4 更新索引页面

来自分类Dev

Angular 4:注入服务后组件消失

来自分类Dev

ngModel 未在 *ngFor Angular 4 中更新

来自分类Dev

angular 4 组件调用多次相同的服务

来自分类Dev

Angular 4 - 逐页更新标题

来自分类Dev

Angular 4 中的多个指令

来自分类Dev

将特定服务扩展到 angular 4 中的子类

来自分类Dev

从 Angular 4 服务中的 HTTP get/post 获取查询参数