延迟加载图像组件在视口中时未更新

Lazy loading image component not updated when is in the view port

我创建了一个组件,当它位于视口中时会自行加载。我面临的问题是它在视口中后不会自行更新。混合作业是检查组件是否在视口中的唯一方法。至于现在,这仅在我每次刷新页面时有效。我希望在用户向下滚动而不是刷新时更新组件。如果有人能让我走上正确的道路,我将不胜感激。

Mixin:

​App.InViewportMixin = Ember.Mixin.create({
    enteredViewport: function(){
       var win = $(window);

        var viewport = {
            top : win.scrollTop(),
            left : win.scrollLeft()
        };

        viewport.right = viewport.left + win.width();
        viewport.bottom = viewport.top + win.height();

        var bounds = this.$().offset();
        bounds.right = bounds.left + this.$().outerWidth();
        bounds.bottom = bounds.top + this.$().outerHeight();

        return (!(viewport.right < bounds.left || viewport.left > bounds.right  || viewport.bottom < bounds.top || viewport.top > bounds.bottom));
    }.property(),
});

分量:

​App.LazyImageComponent = Ember.Component.extend(App.InViewportMixin,{
    loadComponent: function() {
        var enteredViewport = this.get('enteredViewport');
        if (enteredViewport == true) {
             console.log(enteredViewport);
        }
    }.observes("enteredViewport").on('didInsertElement')
});

模板:

{{惰性图片}}

您的计算属性存在一些问题。您将其指定为 property() 而未指定任何依赖属性。所以你的CP只会计算一次,其余次数返回缓存的结果。

现在你还没有做任何事情来监听滚动事件。您将需要添加一个侦听器来重新计算您的 属性.

我对你的代码做了一些修改。 Here is the working demo.

App.InViewportMixin = Ember.Mixin.create({
  windowInstance: null,

  //Setting to null instead of false to trigger when first value is set
  enteredViewport: null, 

  calcViewport: function(win,top, left){
    var viewport = {
      top : top,
      left : left
    };

    viewport.right = viewport.left + win.width();
    viewport.bottom = viewport.top + win.height();

    var bounds = this.$().offset();
    bounds.right = bounds.left + this.$().outerWidth();
    bounds.bottom = bounds.top + this.$().outerHeight();

    var inViewport =  (!(viewport.right < bounds.left || viewport.left > bounds.right  || viewport.bottom < bounds.top || viewport.top > bounds.bottom));

    this.set('enteredViewport', inViewport); 
  },

  scrolled: function() {
    var win = this.get('windowInstance');
    this.get('calcViewport').call(this, win, win.scrollTop(), win.scrollLeft());
  },

  setupScrollListener: function() {
    this.set('windowInstance', $(window));

    //Fire off firstime before any scroll.
    this.get('scrolled').call(this);

    Em.$(window).scroll(this.get('scrolled').bind(this));
  }.on('didInsertElement'),
});

App.LazyImageComponent = Ember.Component.extend(App.InViewportMixin, {
    loadComponent: function() {
        var enteredViewport = this.get('enteredViewport');
        console.log(enteredViewport);
    }.observes("enteredViewport")
});

我刚刚在 didInsertElement 上设置了一个滚动侦听器,它将触发 scroll 处理程序。此处理程序将计算元素是否在视口中并将值设置为 'enteredViewport'。 scroll 处理程序在 didInsertElement 上调用,用于在任何滚动事件触发之前对 属性 进行初始计算。

但是请检查评论中提到的插件。可能会以更好的方式完成。