Angularjs:事件预加载背景图片

时间:2016-05-21 19:50:38

标签: javascript jquery html angularjs image

我正在使用AngularJs使用指令构建滑块,但现在我遇到了问题。这是我home.html的代码

<div class="loading" ng-hide="$root.showSlider">
   <div class="logo">
       <img class="" ng-src="./img/logo.png">
   </div>
</div>

<slider-directive images="images" ng-show="$root.showSlider" ng-if="images"/>

现在我向控制器显示片段:

.controller("HomeController",["$scope","$rootScope", function($scope, $rootScope) {

            (function getData() {
                    //do async call that return data
                    $scope.images = data;
                }, function(err) {
                    console.log(err);
                });
            })();
        }
    ]);

现在我可以显示我的指令代码:

.directive('sliderDirective', function($rootScope, $interval) {
            return {
                restrict: 'E',
                templateUrl: 'html/.../slider.html',
                replace: true,
                scope: {
                    images: '='
                },
                link: function(scope, element, attrs) {

                    scope.currentIndex = 0;

                    scope.next = function() {
                        scope.currentIndex < scope.images.length - 1 ? scope.currentIndex++ : scope.currentIndex = 0;
                    };

                    scope.prev = function() {
                        scope.currentIndex > 0 ? scope.currentIndex-- : scope.currentIndex = scope.images.length - 1;
                    };

                    scope.$watch('currentIndex', function() {
                        scope.images.forEach(function(image) {
                            image.visible = false; // make every image invisible
                        });

                        scope.images[scope.currentIndex].visible = true; // make the current image visible


                        $rootScope.showSlider = true;
                    });

                    $interval(function() {
                        scope.next();
                    }, 10000);
                }
            };
        });

现在我的问题是了解当滑块中的背景中的图像被加载时,我可以删除加载并显示滑块而不会产生不良影响。是否有方法告诉我何时加载所有图像或第一张图像?感谢

1 个答案:

答案 0 :(得分:0)

您可以简单地为第一张图片附加'load'事件处理程序(或者为所有图片添加 - 它取决于您)。看看这个问题:

AngularJS - Image "onload" event

SamBarnes创建了一个简单而好的指令,它允许您轻松附加加载事件处理程序并将其与角度控制器中的函数连接。

修改

我提供了一个带有imageLoaded指令的示例解决方案。

<强> 1。图像加载指令

angular.module('your_module')
    .directive('imageLoaded', ['$parse', ImageLoadedDirective]);

function ImageLoadedDirective($parse) {
    return {
        restrict: 'A',
        scope: {
            imageLoaded: '&'
        },
        link: function (scope, elem, attrs) {
            elem.on('load', function (event) {
                scope.$apply(function () {
                    if (angular.isFunction(scope.imageLoaded)) {
                        scope.imageLoaded();
                    }
                });
            });
        }
    };
}

<强> 2。滑块模板(带图像的简单ng-repeat)

... 

<div ng-repeat="image in images">
    <img ng-src="{{ image.src }}" image-loaded="imageLoadHandler()" />
</div>

...

第3。滑块指令

...

link: function(scope, element, attrs) {

    // Number of currently loaded images
    scope.loadedImagesCount = 0;

    // Function executed when image is loaded
    scope.imageLoadHandler = function() {

        // Increase counter
        scope.loadedImagesCount++;

        // Check if number of loaded images equals slider's images count
        if(scope.loadedImagesCount == scope.images.length) {

            // Do something, when all images are loaded
            alert('all loaded');
        }
    }

...

<强>解释

我将图像加载的指令附加到ng-repeat内的img元素,并在加载每个图像时用它来通知滑块的控制器。在slider指令的作用域中,我添加了一个计数器和一个简单的处理程序,它递增计数器并检查是否所有图像都已加载。