通过信号器加载数据时,在AngularDart中重新绑定页面

通过信号器加载数据时,在AngularDart中重新绑定页面,dart,angular-dart,Dart,Angular Dart,我有一个AngularDart应用程序正在运行,但我觉得我做错了 应用程序在收到事件时显示事件列表。事件通过信号器到达应用程序,但我认为这并不重要——问题是我必须更新组件的状态,以便在页面上显示状态的变化 以下是我的组件的精简版本: @组件(选择器:'liveEvents',templateUrl:'live_events.html',useShadowDom:false) 类LiveEvents实现了ScopeAware{ VmTurnZone _VmTurnZone; EventReceiv

我有一个AngularDart应用程序正在运行,但我觉得我做错了

应用程序在收到事件时显示事件列表。事件通过信号器到达应用程序,但我认为这并不重要——问题是我必须更新组件的状态,以便在页面上显示状态的变化

以下是我的组件的精简版本:

@组件(选择器:'liveEvents',templateUrl:'live_events.html',useShadowDom:false)
类LiveEvents实现了ScopeAware{
VmTurnZone _VmTurnZone;
EventReceiver\u EventReceiver;
LiveEvents(此._vmTurnZone,此._eventReceiver);
列表事件=新列表();
收到无效(事件){
//托多:这似乎不对。。。
_vmTurnZone.run(()=>events.add(event));
}
无效集范围(范围){
var\u events=\u eventReceiver.subscribeToAllEvents(“localhost”,oneventrived);
}
}
EventReceiver
类负责连接到信号服务器,从该服务器接收消息并将其转换为事件对象,然后调用
subscribeToAllEvents
中指定的任何函数(在这种情况下,
\u oneventereceived

角度模板html非常简单:

  • 事件:{{event.Id}
这一切都很好,但我不喜欢的一点是必须将
VmTurnZone
对象注入组件,并且必须在调用
VmTurnZone
的过程中更新该
VmTurnZone
上的events属性。我觉得这有点太复杂了。但是如果我没有在
VmTurnZone.run
方法中执行此操作,则当事件属性更新时,视图不会更新以反映该更改。只有在
VmTurnZone内运行它才能工作

有没有更简单的方法来完成我的任务?我已经考虑过向作用域添加一个手表,但这似乎不起作用(在我看来,它应该用于以另一种方式发生的更改,即视图更新作用域,并且在这种情况下,您希望做一些事情)


任何AngularDart专家都能告诉我是否有更好的方法来完成我的目标吗?

据我所知,当更改源位于Angular识别模型更改的默认角度区域(例如某些JavaScript库)之外时,这是必要的。

您可以将事件添加到流中,然后侦听这些事件,Signaler将看到这些更改,例如:

@Component( selector: 'liveEvents', templateUrl: 'live_events.html', useShadowDom: false )
class LiveEvents implements ScopeAware {
    EventReceiver _eventReceiver;
    LiveEvents( this._eventReceiver );
    List<Event> events = new List<Event>();

    void set scope(Scope scope) {
        subscribe().listen((event){
            events.add(event);
        });
    }

    Stream<Event> subscribe(){
        var streamController = new StreamController<Event>();

        _eventReceiver.subscribeToAllEvents( "localhost", (event){
            streamController.add(event);
        });

        return streamController.stream;
    }
}
@组件(选择器:'liveEvents',templateUrl:'live_events.html',useShadowDom:false)
类LiveEvents实现了ScopeAware{
EventReceiver\u EventReceiver;
LiveEvents(此.\u eventReceiver);
列表事件=新列表();
无效集范围(范围){
订阅()。侦听((事件){
事件。添加(事件);
});
}
流订阅(){
var streamController=新streamController();
_eventReceiver.subscribeToAllEvents(“localhost”,(事件){
streamController.add(事件);
});
返回streamController.stream;
}
}

谢谢你,甘特。我觉得很奇怪,Angular无法“监视”events属性的更改,并在该属性更改时进行相应更新。是否有一些属性我可以添加到属性中,告诉Angular“观察此属性,并将其包括在更改时导致重新绑定的事件列表中”?如果代码与Angular在同一区域中运行,通常不需要此属性,但当它是一些JavaScript代码或其他代码时,没有被相同的
main()调用
方法或由于某些其他原因无法在同一区域中运行,因此引入了
VmTurnZone
以允许进行更改识别。我不知道SignalR,只是假设它是某个JS库。我对这个话题也没有深入的了解,也许其他人知道一个更好的答案。是的,你是对的,SignalR是一个JS库,所以你的假设是正确的。我想我会暂时接受它,但我担心的是a)我会在6个月后忘记它为什么会出现,b)当其他开发人员来开发该产品时,他们不知道它的用途,或者可能会与我们在发现VmTurnZone之前所做的相同的头发拉扯做斗争。只需在
VmTurnZone
行:-)上方的注释中添加一个指向此问题的链接即可,太棒了!谢谢你,这是一个更好的方法。那么angular是否知道如何观看流呢?没问题,据我所知,因为流是在它知道的当前区域中创建的,所以它将对添加到流中的新事件作出反应。