@(Work)[Avalon|IScroll]
verison: @lastest 0.1.0
GitHub: http://github.com/EdwonLim/avalon.iscroll
Avalon GitHub & Documents: https://github.com/RubyLouvre/avalon
IScroll GitHub & Documents: https://github.com/cubiq/iscroll
- Avalon makes love with IScroll.
- 新增指令,使
Avalon
用户更容易使用iScroll
。 - 对于
ms-repeat
或ms-each
,支持infinite
滚动。
当监听 beforescrollstart
, scrollcancel
, scrollstart
, scroll
, scrollend
, flick
, zoomstart
, zoomend
中一个或多个事件时,会自动初始化iscroll
。
辅助指令 data-scroll="id, optName"
id
: 将通过id
挂在vmodel
的scrolls
对象上,便于用户访问IScroll
对象。optName
: 配置属性的名称,在vmodel
上寻找对应的属性值,作为配置。
PS: id
可用$
占位,options
也可使用data-optionKey='optionValue'
和vm.iscroll
配置,类似于widget
配置方式。
注:实际参数请参看IScroll
文档。
示例:
HTML
:
<div ms-controller="test">
<div ms-on-scroll="scroll" data-scroll="scroll1, $opt">
<ul>
<li></li>
...
</ul>
</div>
</div>
JS
:
require('avalon.iscroll.js', function(avalon) {
var test = avalon.define('test', function(vm) {
...
vm.$opt = {
... // iScroll 配置
}
vm.scroll = function() {
};
...
});
avalon.scan();
});
注:本套件依赖于iscroll-infinite
,所以将列出一些使用infinite
时的注意事项。
-
无限滚动,滚到最后加载新数据,在移动端体验比较好。
-
iscroll
提供的infinite
,使用translate
进行位移,所以在滚动时,没有进行dom
的增添,只是修改某一个节点dom
,重绘的范围比较小,从而保证在移动端的执行效率和内存使用量。并且avalon
通过model
操作view
的方式,非常有利于dom
节点的数据重新渲染。
默认配置:
{
showLines: 10, // 显示的数量
infiniteElements: null, // 重复加载的元素,最好配选择器,默认为avalon array 所绑定的元素
mouseWheel: false, // 是否支持鼠标滚轮(提出来方便测试)
infiniteLimit: 25, // 数量极限(到达极限时,会调用getData方法)
cacheSize: 25, // 缓存数量
getData: function(start, count) {
// 加载更多数据的回调
// 获取数据后,更新源数组即可
// 同时会触发 el 的 getdata 事件·
}
}
其中 showLines
是 ms-iscroll
特殊配置,其他都是iscroll
配置。
showLines
: 一屏显示的数量。
事件监听:
可以在元素上监听iscroll
的事件,例如ms-on-scrollstart
。
包含的事件有:beforescrollstart
, scrollcancel
, scrollstart
, scroll
, scrollend
, flick
, zoomstart
, zoomend
- 如果你的数组名称是
list
,那么请定义一个僵尸数组list$
。(PS:avalon
暂时不可以动态添加可监控属性)
avalon.define('test', function() {
vm.list = [];
vm.list$ = [];
});
- 对于
Dom
结构,需要满足iscroll-infinite
,需要所有item
的绝对位置是相同的,组简单的实现是,把item
的position
设为absolute
。
688
行: 增加this._initInfinite();
让scroll
刷新时,也更新infinite
。1433
/1434
行: 从this.infiniteElementHeight = this.infiniteMaster.offsetHeight
改为this.infiniteElementHeight = this.infiniteMaster ? this.infiniteMaster.offsetHeight : 0;
,支持空数据。1443
/1444
行: 从this.infiniteUpperBufferSize = Math.floor((this.infiniteLength - elementsPerPage) / 2);
改为this.infiniteUpperBufferSize = 0;
。原来如果行数不足,会把列表居中,现在改为置顶。