2013-03-09 3 views
2

Я знаю, что InfiniteScroll и масонство хорошо работают вместе. Но я использую Infinite Scroll Extension Yii (называемый yiinfinite-scroll) и пытаюсь применить масонство на нем. Бесконечный Свиток для себя отлично работает, масонство для себя тоже. Но после того, как InfiniteScroll попытается загрузить новый набор изображений (у меня есть страница с изображениями), часть обратного вызова InfiniteScroll, похоже, не срабатывает, потому что недавно добавленные элементы не содержат в ней каменного кода и появляются позади первые видимые элементы. (Я знаю, что эта ошибка часто сообщается, но решения, которые я нашел до сих пор, не работали для меня).Yii Framework + Бесконечный свиток + Каменная обратная связь не работает

Моя структура для показа картина выглядит следующим образом:

<div class="items"> 
<div class="pic">...</pic> 
<div class="pic">...</pic> 
... 
</div> 

Первая загрузка страницы выглядит следующим образом

<div class="items masonry" style="..."> 
    <div class="pic masonry-brick" ...></div> 
    <div class="pic masonry-brick" ...></div> 
    ... 
</div> // everything's fine, masonry is injected into the code 

После бесконечной прокрутки динамически загружает новые изображения, они выглядят так:

<div class="items masonry" ...></div> 
    <div class="pic masonry-brick" ...></div> 
    ... 
    // appended pics: 
    <div class="pic"></div> 
    <div class="pic"></div> 
</div> // so no masonry functionality was applied 

Мой кладочный код:

$(function(){ 
     var $container = $('.items'); 
     $container.imagesLoaded(function(){ 
      $container.masonry({ 
      itemSelector: '.pic', 
      columnWidth: 405 
     }); 
     }); 
    }); 

    $container.infinitescroll({ 
     // normally, the options are found here. but as I use infinitescroll as a Yii extension, the plugin is already initiated with options 
     } 
    }, 
    // trigger Masonry as a callback 
    function(newElements) { 
     // hide new items while they are loading 
     var $newElems = $(newElements).css({ opacity: 0 }); 
     // ensure that images load before adding to masonry layout 
     $newElems.imagesLoaded(function(){ 
     // show elems now they're ready 
     $newElems.animate({ opacity: 1 }); 
     $container.masonry('appended', $newElems, true); 
     }); 
    }); 
    }); 

Я также попытался скопировать и заменить текущий файл InfiniteScroll-min.js в папке расширения самой новой. Тот же эффект ...

С наилучшими пожеланиями, Себастьян

ответ

5

Хорошо, я нашел решение. Я его здесь, если кто-то имеют тот же вопрос:

Я просто модифицировал YiinfiniteScroller класса от Yii расширения Yiinfinite прокрутки и добавил обратный вызов части для Infinite Scroll, который пропал без вести:

private function createInfiniteScrollScript() { 
    Yii::app()->clientScript->registerScript(
      uniqid(), 
      "$('{$this->contentSelector}').infinitescroll(".$this->buildInifiniteScrollOptions().", ".$this->callback.");" 
    ); 
} 

В начале класса I добавлена ​​строка public $ callback; , чтобы использовать его позже в методе.

Затем вы можете вызвать виджет с дополнительной опцией обратного вызова, например, так:

'callback' => 'function(newElements) { 
        // hide new items while they are loading 
        var $newElems = $(newElements).css({ opacity: 0 }); 
        // ensure that images load before adding to masonry layout 
        $newElems.imagesLoaded(function(){ 
         // show elems now theyre ready 
         $newElems.animate({ opacity: 1 }); 
         $(".items").masonry("appended", $newElems, true); 
        }); 
       }', 

работает как шарм.

Смежные вопросы