【问题标题】:Flicker on data update Angularjs数据更新Angularjs闪烁
【发布时间】:2016-11-04 17:44:48
【问题描述】:

我有一组用户需要更新,以防数据库中的数据发生更改。为此,我从控制器调用更新函数。

在控制器中

$scope.update = function(){
    $http.get("....")
    .success(function(data){
        $scope.users = data;
    })
};

在模板中

<div ng-repeat="user in users">
  ...
</div>

在更新函数调用时可以注意到 Div 闪烁。有没有办法避免这种情况?

【问题讨论】:

  • “闪烁”是什么意思?它是最初发生的,在页面第一次加载时发生,还是在每次调用更新方法时发生?
  • 使用ngAnimate?
  • @JanS 每次我调用更新函数时
  • 我不知道您的数据集有多大以及性能是否是关键,但您可以尝试区分当前数据和新数据 - 删除不再存在的数据并添加新数据。
  • 你多久调用一次更新方法?如果在显示相同数据时主要是一个问题,您可以避免在 $scope.users 和 data 相等时设置 $scope.users

标签: javascript angularjs flicker


【解决方案1】:

我遇到了同样的问题。正在寻找我以外的其他解决方案。大概只有这一个。

“闪烁”的根本原因是重新创建 DOM,因为您将新的普通对象分配给范围:$scope.users = data;。该对象不包含 Angular 的跟踪数据,因此引擎从一开始就启动一切。这种效果很烦人,尤其是当您对正在刷新的元素使用 CSS 动画时 - 一切都在闪烁、重置等。

我该怎么做才能避免它?我不这样做 $scope.data = data;,但我确实通过 data 的新版本更新了 $scope.data 的每个对象(在你的情况下)。

查看下面的代码。就我而言,我获取新的服务器列表,然后只应用更改。

$scope.servers = [];

$http.get('/panel/dashboard').then(function(res) {
    // find and upgrade servers
    for (var n in res.data.servers) {
        var s = res.data.servers[n];

        var l = get_server(s.id); // helper - get by ID from $scope.servers
        if (l) {
            $scope.servers.push({
                id: s.id, 
                name: s.name, 
                state: s.state
            });
        } else {
            // do update values only
            l.name = s.name;
            l.state = s.state;                
        }
    }

    // remember to remove old items that are in $scope.server and not in res.data
    // then sort data   
});

我希望它有所帮助。这里最重要的不是“如何解决”,而是了解“它是如何工作的”。

【讨论】:

  • 感谢分享这个解决方案,它也适用于我。
【解决方案2】:

ng-cloak 指令与以下 CSS 一起添加到您的代码中:

[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
  display: none !important;
}

更多信息可以在 Angular 文档中找到——https://docs.angularjs.org/api/ng/directive/ngCloak

文档指出 CSS 嵌入在 angular.js 文件中...但是由于我通常按照最佳实践将我的 JavaScript 加载到页面的末尾,所以闪烁仍然发生。相反,我只是将必要的 CSS 添加到我的网站 css 文件中,这似乎有效。

【讨论】:

  • 我试过这个,但无法让它工作。我在某处读到这仅适用于第一页加载。
猜你喜欢
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 2017-01-29
  • 1970-01-01
相关资源
最近更新 更多