14

我希望能够阻止加载具有 ng-src 属性的图像,直到它在视口中可见。

Angular可以做到这一点吗?

以前我使用过jQuery LazyLoad Plugin,但是我试图这样做而不必同时拥有 Angular 和 jQuery。

4

3 回答 3

5

如果您仍然感兴趣,我在 github 上找到了这个 repo: https ://github.com/afklm/ng-lazy-image

我试过了,它摇滚!

仅当出现在视口中时才加载图像,并且您可以根据屏幕尺寸选择要加载的图像。这意味着您可以为移动用户加载较小的图像;)

于 2015-07-27T19:10:20.380 回答
5

在 angularjs 中,可以使用指令实现延迟加载。

脚步:

步骤 1. 创建指令如下:

App.directive('lazyLoad', lazyLoad)
function lazyLoad() {
     return {
          restrict: 'A',
          link: function (scope, element, attrs) {
                 const observer = new IntersectionObserver(loadImg);
                 const img = angular.element(element)[0];
                 observer.observe(img)
                 function loadImg(changes) {
                        changes.forEach(change => {
                              if (change.intersectionRatio > 0 && change.target.getAttribute('tempData')) {
                                    change.target.src = change.target.getAttribute('tempData');
                              }
                        });
                 }                     
          };
     };
};

第 2 步:在标签中使用延迟加载属性并将“ng-src”替换为 tempData,例如。在 html 中

<img ng-repeate="obj in objects" lazy-load tempData="obj.srcURL">

注意:我们没有直接分配 src ,因为我们想阻止图像向服务器发送请求以加载图像。

重要提示:依赖于 es-6。在进行构建时,您可能会遇到解析错误。

*解决方案:npm install --save gulp-uglify-es

安装命令后,您需要更新 gulp 文件。这将安装依赖项,您的代码现在可以构建。

就这样!!!

感谢阅读!!!

于 2018-04-09T12:16:42.993 回答
0

我认为您可以将源绑定到仅在元素可见时才返回值的 getter(假设您正在使用某种绑定来触发 img 的可见性)。

例如,ng-src="{{getImgSource()}}"在您的控制器中使用和:

scope.getImgSource = function(){
    if(scope.showImg){
        return "myImageUrl.png";
    }
    return ""; 
};

但是,如果这是您必须经常使用的东西,也许您应该考虑创建自己的指令来做到这一点。

于 2013-08-02T07:53:03.603 回答