Angular2省道用于在使用WebSocket时不更新视图

Angular2省道用于在使用WebSocket时不更新视图,websocket,angular,dart,dart-html,Websocket,Angular,Dart,Dart Html,我的angular2组件有问题。当我使用WebSocket时,视图不会更新。我尝试过http请求,但效果很好,但我需要更新视图中的数据 我可以使用WebSocket连接到服务器,并且可以接收数据,但是我的视图不会更新 @Component( selector: "pv-table", templateUrl: "./table.component.html" ) class TableComponent { WebSocket _connection; // NgZone _

我的angular2组件有问题。当我使用WebSocket时,视图不会更新。我尝试过http请求,但效果很好,但我需要更新视图中的数据

我可以使用WebSocket连接到服务器,并且可以接收数据,但是我的视图不会更新

@Component(
  selector: "pv-table",
  templateUrl: "./table.component.html"
)

class TableComponent
{
  WebSocket _connection;

  // NgZone _zone;
  // ApplicationRef _application_ref;

  List data;

  TableComponent(/* this._zone, this._application_ref */)
  {
    _connection = new WebSocket( "ws://${HOST}:${PORT}" );

    _connection.onOpen.first.then( ( _ ) {
      _connection.onMessage.listen( ( MessageEvent e ) => OnMessage( e.data ) );

      // A simple class that gives my application a standard
      // way to communicate.
      Packet request = new Packet()
        ..message = "table.get"
        ..data    = {};

      _connection.send( JSON.encode( request ) );

      _connection.onClose.first.then( ( _ ) { });
    });
  }

  void OnMessage( String data )
  {
    Map    res = JSON.decode( data );
    String cmd = res[ "message" ];

    Log.Info( cmd );

    switch( cmd )
    {
      case "table.send":
        // Setting the data here. This works
        data = res[ "data" ];

        // This prints the correct data in the developer console.
        Log.Info( data ); 

        // Neither of these help.
        // _zone.run( () => data = res[ "data" ] );
        // or
        // _application_ref.tick();

        break;

      default:
        Log.Warn( "Unknown command: $cmd" );
        break;
    }
  }
}
我在谷歌上搜索了一下,发现了一些类似这样的问题,即使用
NgZone.run(…)
ApplicationRef.tick()
强制执行更改检测,但这没有帮助。要么它们不适合这种情况,要么我不知道如何使用它们

我的模板如下所示:

<p *ngFor="let person of data">
  <span scope="row">{{ person[ "_id" ] }}</span>
  <span>{{ person[ "name" ] }}</span>
  <span>{{ person[ "job" ] }}</span>
  <span>{{ person[ "date_due" ] }}</span>
</p>

{{person[“{id]}}
{{person[“name”]}
{{person[“job”]}
{{人[“到期日期”]}


正如评论中提到的那样。我可以在开发人员控制台中看到正在打印的数据。它的格式是正确的,一个包含正确字段的地图列表,但页面仍然是空白的。

结果证明我真的非常愚蠢

让我们看一些东西好吗

处理传入数据的方法的签名:
void OnMessage(字符串数据)

我试图在模板中使用的成员:
列表数据

OnMessage
方法中的赋值:
data=res[“data”]

注意到什么奇怪的事了吗? 可能类成员和方法参数具有相同的名称? 也许这意味着参数正在跟踪成员? 也许这意味着对该名称的赋值实际上是对参数的赋值,而不是对成员的赋值

最糟糕的是,我已经在这里坐了将近两个小时,试图找出问题所在

换两行,一切正常

  • void-OnMessage(字符串数据)
    =>
    void-OnMessage(字符串响应数据)
  • Map res=JSON.decode(数据)=>
    Map res=JSON.decode(响应数据)