Angular ng-animate 仅对数据更改进行动画处理

Posted

技术标签:

【中文标题】Angular ng-animate 仅对数据更改进行动画处理【英文标题】:Angular ng-animate only animate on data change 【发布时间】:2017-01-14 08:03:27 【问题描述】:

我有一个表格,我希望在添加或删除一行时对其进行动画处理。我有一个函数每 2 秒调用一次角度控制器来获取数据。一切正常,但表格每 2 秒动画一次。整件事每 2 秒消失一次。我只希望添加或删除的新行淡入或淡出。这是我的代码。

HTML

<h1>
Scans
</h1>
<body ng-app="myApp" ng-controller="ScansController" >   
    <table id="scansTable" class="table table-striped">
        <thead>
            <tr>
                <th>ScanId</th>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Time Stamp</th>
            </tr>
            <tr ng-repeat="scan in Scans">
                <td>
                    scan.scanId
                </td>
                <td>
                    scan.firstName
                </td>
                <td>
                    scan.lastName
                </td>
                <td>
                    scan.timeStamp
                </td>
            </tr>
        </thead>
    </table>

CSS

tr 
opacity: 1;

tr.ng-enter 
-webkit-transition: 1s;
transition: 1s;
opacity: 0;

tr.ng-enter-active 
opacity: 1;


</style>

控制器

var myApp = angular.module('myApp', ['ngAnimate']);

myApp.service('dataService', function ($http) 

this.getData = function () 

    return $http(
        method: 'GET',
        url: '/api/scans/'
    );

);

myApp.controller('ScansController', function ($scope, dataService, $timeout) 

$scope.Scans = [];

function fetchData() 
    dataService.getData().then(function (result) 
        $scope.Scans = result.data;
        $timeout(function ()  fetchData(); , 2000);
    );


fetchData();

);

【问题讨论】:

您是否在模块中加载了ngAnimate 作为依赖项?例如angular.module('app', ['ngAnimate']); @papakia 我以前没有,但我只是添加了它,它仍然没有动画。 how to use animation with ng-repeat in angularjs的可能重复 @papakia 是的,这解决了动画,但是有一个新问题。问题已更新。 【参考方案1】:

我将控制器修改为以下,并摆脱了动画 css。现在我的表格只在数据变化时产生动画,但这只是在数组长度不同的情况下。

var myApp = angular.module('myApp', []);

myApp.service('dataService', function ($http) 

this.getData = function () 

    return $http(
        method: 'GET',
        url: '/api/scans/'
    );

);

myApp.controller('ScansController', function ($scope, dataService, $timeout) 

$scope.Scans = [];
$scope.NewScans = [];

function fetchData() 
    dataService.getData().then(function (result) 

        $scope.Scans = result.data;
        $("#scansTable").removeClass('animated bounceIn');           
    );


function fetchNewData() 
    dataService.getData().then(function (result) 

        $scope.NewScans = result.data;

        if ($scope.Scans.length != $scope.NewScans.length)
                       
            $("#scansTable").addClass('animated bounceIn');
            $scope.Scans = $scope.NewScans              
        

        $timeout(function ()  fetchNewData(); , 1000);
    );


fetchData();
fetchNewData();

);

【讨论】:

【参考方案2】:

我建议使用合并。

改变这一行:

$scope.NewScans = result.data;

到:

angular.merge($scope.NewScans, result.data);

这样做,您将保留对 $scope.NewScans 的引用,并且只有其更改的内容才能获得更新。

【讨论】:

以上是关于Angular ng-animate 仅对数据更改进行动画处理的主要内容,如果未能解决你的问题,请参考以下文章

动画 ng-repeat 没有 ng-animate

Sql 查询仅对一列上的数据进行排序,但不更改其他列

仅对表中的一列授予更改

带有 ng-class 指令的 ng-animate

带有 Angular 1.x 和 ES5 的 Webpack

AngularJS:使用 ng-animate & ng-view,如何制作 3D 立方体旋转效果?