avalon与masonry的连系

相干组件版本:avalon 1.3.6、masonry 3.1.5

近来,在公司的项目中,要开辟一个运用瀑布流的前台,衡量了种种解决计划后,照样以为masonry最成熟,所以就选用了它。而在之前开辟背景的过程当中,对avalon也用得挺熟手的了,所以此次做前台也用上。因为avalon是管dom的,masonry也是管dom的,所以完成兼容的重点就是,让它们管统一份dom,而不是各管各的。

我的avalon相干代码是如许的:

    avalon.define({
      $id: 'masonry',
      article_list: <?php echo $articleList; ?>,
    });

个中的article_list就是寄存瀑布流数据的数组,用php天生json花样的字符串输出,赋给article_list作为初值(初版数据)。然后,挪用avalon的ms-repeat指令来轮回衬着瀑布流的dom:

  <!-- 瀑布流位置 -->
  <div id="masonry_container" ms-controller="masonry">
    <div id="masonry_content">
        <div class="portfolio" ms-repeat-article="article_list">
          <div class="portfolio-wrapper" ms-click="open_article_modal(article.id)">
              <a> 
                <img ms-attr-src="article.cover_img_url" ms-css-height="article.cover_img_height"> 
              </a>
              <div class="article_follow side_btn"></div>  
              <div class="article_collect side_btn"></div>  
              <div class="article_body">
                <div class="article_meta">
                    <h2>{{article.title}}</h2>
                    <p></p>
                </div>
              </div>
          </div>
        </div>
    </div>
  </div>

在avalon.scan()今后,实例化masonry,初版数据就算是出来了,一切都很正常。

然则在后面继承加载数据的时刻,就出题目了。我的设想是,推断当滚动条拉到最下,就触发事宜用ajax读取第二、三、四……版的数据。

一最先我想得很简单:不就是把ajax猎取到的数据直接添加到avalon的vm里,让它自动完成新数据的衬着就好了,然后再从新实例化masonry。这类计划的题目是,因为“从新实例化masonry”须要的是先把masonry对象destroy()掉,所以就会看到很明显的闪灼,而且,能够预想到,当数据越来越多的时刻,从新实例化的价值就会越来越大,因而这类计划是不可取的。

接着我仔细阅读了masonry的文档,发明其原来是有addItems/appended如许的要领可供挪用的,我读了文档上的示例代码(一个小插曲,因为本人的原生js实在是太不济,就想着用jquery版的,却发明无论如何都调不通,也许是因为用了requireJS来模块化的原因吧,这里临时不提),发明这个要领的道理就是先往dom树里添好新的dom节点,然后再将新的dom节点作为参数传入addItems/appended。这就使我犯难了,我的dom树是交给avalon来处置惩罚的,又不是本身拼的,哪来dom节点能够传给masonry呀?为了做出一份能够传给masonry的dom节点,我也是拼了,用jquery来天生一份dom节点再传给masonry,但是试了一下,无效呀,masonry根本就没有掌握新增dom节点的位置。

这时刻我在嘀咕,会不会是avalon还未天生dom节点,masonry就最先“掌握”的原因呢?为了测试这个可能性,我运用了avalon中的data-repeat-rendered指令,这个指令能够指定一个函数,在ms-repeat衬着完后再实行,如许就能够保证avalon已天生好dom节点后masonry再参与。测试的效果很使人懊丧,masonry依旧没有掌握dom节点的位置,所以应当不是这个题目。

终究,在我的测试下,准确的做法是:把avalon天生的dom节点传给masonry,怎样完成呢?说起来也很简单,纪录下拉取新数据前瀑布流已有多少个文块,也纪录下拉取到多少个文块,如许就能够获得新增文块索引的局限是从几到几了;当avalon衬着完ms-repeat后,用jquery猎取瀑布流一切文块的dom树,再依据算出来的新增文块索引局限,将新增的dom节点取出来后,传给masonry,就功德圆满了!

    原文作者:array_huang
    原文地址: https://segmentfault.com/a/1190000004084601
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞