繁体   English   中英

ng-repeat在角度数组更改时未更新

[英]ng-repeat not updated on array change in angular

我的目标是使用websockets to receive some JSON`并更新指令中的表。

我创建了一个简单的指令:

app.directive("penaltyTable", function() {
return {
    restrict: 'E',
    templateUrl: '/Content/AngularPartials/Coach/PenaltyLine.html',
    controller: function() {
        this.players = [];
        var penaltyController = this;

        var uri = "ws://localhost.local/api/CoachesTracker/10";

        //Initialize socket
        var websocket = new WebSocket(uri);

        // Error handling stuff here.....

        //Socket message handler
        websocket.onmessage = function (event) {
            var data = JSON.parse(event.data);
            penaltyController.players = data;
        };
    },
    controllerAs: 'penaltyTrackerCtrl'
};
});

我创建了一个简单的模板PenaltyLine.html

<table class="penalty-table">
    <tr ng-repeat-start="player in penaltyTrackerCtrl.players">
        <td>{{player.Number}}</td>
    </tr>
    <tr ng-repeat-end>
        <td>{{player.Name}}</td>
    </tr>
<table>

我的Web套接字从服务器上接收数据正常,似乎正在更新播放器数组,但是模板从未更新以显示新数据。

我想我要学会跑步才能弯腰走路! 我缺少一些基本的东西吗?

您需要触发摘要。 一种安全的方法是使用$ timeout,且延迟时间为0。 您还可以在$ scope。$ apply中调用代码(检查摘要是否尚未运行)。 $ timeout虽然难看,但通常是首选。

app.directive("penaltyTable", function($timeout) {
return {
    restrict: 'E',
    templateUrl: '/Content/AngularPartials/Coach/PenaltyLine.html',
    controller: function() {
        this.players = [];
        var penaltyController = this;

        var uri = "ws://localhost.local/api/CoachesTracker/10";

        //Initialize socket
        var websocket = new WebSocket(uri);

        // Error handling stuff here.....

        //Socket message handler
        websocket.onmessage = function (event) {
            $timeout(function() {
                var data = JSON.parse(event.data);
                penaltyController.players = data;
            });
        };
    },
    controllerAs: 'penaltyTrackerCtrl'
};
});

原因是AngularJS不知道您的websocket只是收到一条消息,因此也不知道以“ Angular”的数据绑定和监视程序等方式发生了任何事情。也许,巧合的是,您的应用程序中发生了一些事情来触发只是在那一刻的摘要,您看不到问题,但是大多数时候您会发现。

更好的解决方案可能是在websocket周围编写一个包装,该包装在运行任何回调后都调用$ rootScope。$ digest。 如果您没有做太多,那么最好还是这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM