【问题标题】:Rebinding a page in AngularDart when the data is loaded via SignalR通过 SignalR 加载数据时在 AngularDart 中重新绑定页面
【发布时间】:2015-02-28 00:26:58
【问题描述】:

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

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

这是我的组件的精简版:

@Component( selector: 'liveEvents', templateUrl: 'live_events.html', useShadowDom: false )
class LiveEvents implements ScopeAware {
    VmTurnZone _vmTurnZone;
    EventReceiver _eventReceiver;
    LiveEvents( this._vmTurnZone, this._eventReceiver );
    List<Event> events = new List<Event>();
    void _onEventReceived(Event event) {
        //TODO: This just does not seem right...
        _vmTurnZone.run(() => events.add(event));
    }

    void set scope(Scope scope) {
        var _events = _eventReceiver.subscribeToAllEvents( "localhost", _onEventReceived );
    }
}

EventReceiver 类负责连接到 SignalR 服务器,从该服务器接收消息并将它们转换为事件对象,然后调用 subscribeToAllEvents 中指定的任何函数(在本例中为 _onEventReceived

angular模板html很简单:

<ul>
    <li ng-repeat="event in events">Event: {{event.Id}}</li>
</ul>

这一切都很好,但我不喜欢的一点是必须将 VmTurnZone 对象注入到组件中,并且必须在对 run 的调用中更新事件属性 VmTurnZone .这对我来说似乎有点过于复杂。但是,如果我不在 VmTurnZone.run 方法中执行此操作,则当 events 属性更新时,视图不会更新以反映该更改。只有在VmTurnZone.run 内才能工作。

有没有更简单的方法来做我在这里追求的事情?我已经考虑将手表添加到范围,但这似乎不起作用(在我看来,它应该用于以相反方式发生的更改 - 即,视图更新范围,并且你想要发生这种情况时做点什么)。

任何 AngularDart 专家都可以告诉我是否有更好的方法来做我所追求的吗?

【问题讨论】:

    标签: dart angular-dart


    【解决方案1】:

    https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:async.Stream

    您可以将事件添加到流中,然后监听这些事件,信号器将看到这些更改,例如:

    @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;
        }
    }
    

    【讨论】:

    • 太棒了!谢谢你 - 这是一种更好的方法。那么 Angular 不知何故知道要观看流媒体?
    • 没问题,据我所知,因为流是在当前区域创建的,所以它知道它会响应添加到流中的新事件。
    【解决方案2】:

    据我所知,当更改源位于默认 Angular 区域(例如某些 JavaScript 库)之外时,Angular 必须这样做才能识别模型更改。

    【讨论】:

    • 感谢君特。在我看来,Angular 无法“观察”事件属性的更改并在该属性更改时相应地更新,这对我来说似乎很奇怪。是否有一些我可以添加到属性中的属性来告诉 Angular“注意这个属性并将它包含在你的列表中,这些内容在更改时会导致重新绑定”?
    • 如果代码在与 Angular 相同的区域中运行,但当它是一些 JavaScript 代码或一些其他代码没有被相同的 main() 方法或其他原因调用时,您通常不需要这个不在同一个区域运行,VmTurnZone 被引入以允许更改识别。我不知道 SignalR,只是假设它是一些 JS 库。我对这个主题也没有深入的了解,也许其他人知道更好的答案。
    • 是的,你是对的,SignalR 是一个 JS 库,所以你的假设是正确的。我想我现在只能忍受它,但我担心的是 a)我会在 6 个月后忘记它为什么会出现 b)当其他一些开发人员来开发产品时,他们不会知道是什么它是为了,或者可能与我们在发现 VmTurnZone 之前所做的相同的头发拉扯斗争。
    • 只需在VmTurnZone 行上方的评论中添加指向此问题的链接即可:-)
    猜你喜欢
    • 2022-06-14
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2019-07-20
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多