2

簡単な WebSocket サービスとコンポーネントを作成しましたが、WebSocket を介して新しいデータを受信したときにビューを更新するのに苦労しています。

websocket.service.ts

import {Injectable} from "angular2/core";
import {Observable} from 'rxjs/Observable';

@Injectable()
export class WebsocketService {

    observable: Observable;
    websocket = new WebSocket('ws://angular.local:8080');

    constructor() {
        this.observable = Observable.create(observer =>
            this.websocket.onmessage = (msg) => observer.next(msg);
            this.websocket.onopen = (msg) => console.log('openned');

        );
    }
}

ランナー.コンポーネント.ts

import {Component} from "angular2/core";
import {WebsocketService} from "./websocket.service";

@Component({
    selector: "runners-list",
    templateUrl: "../partials/runners-list.html",
    providers: [WebsocketService],
    styleUrls: ["../css/app.css"]
})

export class RunnerComponent {

    output: any;

    constructor(private _websocketService: WebsocketService) {
        _websocketService.observable.subscribe(
            function onNext(data) {
                this.output = data;
                console.log(this.output);
            },
            function onError(error) {
                console.log(error);
            },
            function onCompleted() {
                console.log('completed');
        });
    }
}

runners-list.html

<h1>{{output}}</h1>

コンポーネントで onNext メソッドが正常に呼び出され、コンソールに新しいデータが正しく出力されますが、ビューは更新されません。ngZone でも試してみましたが、成功しませんでした。

4

1 に答える 1

6

lexical を使用できるようにするには、コールバックにアロー関数を使用する必要がありますthis

constructor(private _websocketService: WebsocketService) {
    _websocketService.observable.subscribe(
        (data) => {
            this.output = data;
            console.log(this.output);
        },
        (error) => {
            console.log(error);
        },
        () => {
            console.log('completed');
    });
}

あなたの場合、thisコンポーネントのインスタンスに対応していません...

アロー関数の字句 this に関するヒントについては、 https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions のリンクを参照してください。

于 2016-02-13T11:46:39.417 に答える