AngularJS指令图像在任何范围更新时闪烁

时间:2014-09-16 18:45:36

标签: javascript angularjs image angularjs-directive angularjs-scope

我从websocket获取数据。在那个数据中我有lastEmplyeeID,用于在img文件夹中查找员工pic并通过指令显示。不幸的是,任何时候控制器范围的某些部分都会发生变化(例如,图像闪烁。

指令:

myDirectives.directive('headshot', function($http) {
return {
    restrict: 'AE',
    scope: {
        lastID: '@lastid'
    },
    template: '<img ng-src="{{imgSrc}}" class="headshot">',
    link: function(scope, element, attrs) {

        attrs.$observe('lastid', function(id) {

            scope.id = id;
            var src = 'img/nophoto.png';
            scope.imgSrc = (src);

                var url = 'photo/photo.aspx';

                //get name of the image based on employee id
                $http.get(url + '?id=' + scope.id)
                        .success(function(data) {
                            var src = 'img/' + data;
                            scope.imgSrc = (src);
                        })
                        .error(function(error) {                           
                        });              
        })
    }
};
});

查看:

 <div id="imageWrapper">
    <headshot lastid="{{lastID}}"></headshot>
</div>

控制器:

myControllers.controller('MyCtrl',
    [
        '$scope', '$rootScope', '$http', 'webSocketService', 
        function($scope, $rootScope, $http, webSocketService) {
            $http.defaults.useXDomain = true;

            var data = {};

            //get data from socket
            webSocketService.getData();
            $rootScope.$on('broadcast', function() {

                data = webSocketService.message;
                $scope.eventState = data.event.eventState;
                $scope.lastID = $scope.eventState.lastEmployeeID;

                $scope.groups = data.event.groups; //when groups change, the picture of last employee flickers

            });
        }]);

1 个答案:

答案 0 :(得分:0)

我无法使用提供的代码重现闪烁,但您可能需要检查或执行以下操作:

  1. 确保没有其他内容在'广播'上播出。

  2. 当控制器内的数据发生变化时,确保父DOM元素不会强制爆头刷新。

  3. 或许将您的指令重构为:

     myDirectives.directive('headshot', function($http) {
        return {
            restrict: 'AE',
            scope: {
                lastID: '@lastid'
            },
            template: '<img ng-src="{{imgSrc}}" class="headshot">',
            link: function(scope, element, attrs) {
    
                var src = 'img/nophoto.png';
                scope.imgSrc = (src);
                var last_id = -1;
    
                attrs.$observe('lastid', function(id) {
                    if ( last_id !== id ) {
                        //get name of the image based on employee id
                        $http.get('photo/photo.aspx?id=' + id).success(function(data) {
                            src = 'img/' + data;
                            scope.imgSrc = (src);
                        }).error(function(error) {                           
                            src = 'img/nophoto.png';
                            scope.imgSrc = (src);                
                        });
                        last_id = id;              
                    }
                })
            }
        };
    });
    
  4. 在http服务能够加载到正确的图像之前,您的闪烁可能是由scope.imgSrc短暂重置为“img / nophoto.png”引起的。此外,您应该保持一些状态并检查以确保新的lastid实际上与前一个值不同(也将阻止无关的http调用)。这个重构应该可以防止这种情况,虽然我实际上并没有将其视为问题的原因,因为如果我理解你的问题,那么lastid实际上不应该在闪烁的情况下发生变化。如果您在员工形象 更改时抱怨闪烁,那么这应该可以解决您的问题。