作者:蔡依辰
说明:对小程序商品分类、首页的轮播图和快捷按钮功能,在添加、拖拽排序时获取sort值,并按sort值从大到小排列。
思路
分类是按自上而下、按sort值从大到小的顺序排列。
分类sort值图:
添加分类时获取其sort值
添加时,即向队列中push数据,添加项的sort值=分类列表中最大的sort值+SORT_ADD_UNIT_NUM。
注意:首次添加时,可以将分类列表中最大的sort值看做虚线框中的0。
代码
// SORT_ADD_UNIT_NUM:拖拽排序时sort加的单元值
// 获取sort值(最大sort值+SORT_ADD_UNIT_NUM)
addCategoryInfo.sort = $scope.goodCategoryList.length == 0 ? SORT_ADD_UNIT_NUM : $scope.goodCategoryList[0].sort + SORT_ADD_UNIT_NUM;
拖拽排序时获取其最新sort值
拖拽排序时可能有以下三种情况:
向中间插入:取插入后位置的上下两项的sort值,再求和/2;
向顶部插入:类似添加分类;
向底部插入:取插入后位置的上下两项的sort值,再求和/2(可以将下方项的sort值看做虚线框中的0)。
注意
当非常多次的连续拖拽时,会造成sort值的位数越来也长,以至于请求api接口时会丢失部分后面的位数值。
为了减少发生这个问题的次数,如当拖拽到第10次时就会出现这个问题,我们可以优化到拖拽到第15次或者甚至更多次后才会出现这个问题。如下解决思路。
解决思路
这个思路在将新版编辑器v2.0中实现,现在还未实现
当检测到sort值已经被分到小数点滴三位时,如将一个项拖拽到0.0002 和0.0001之间时,按之前的方式将会得到新sort值0.00015。新方式:在最小的0.0001的基础上,小数点再往后移动一位(即0.00010)且最后一位加2(这个值可以设计下),得到新sort值0.00012。
代码
/**
* 获取当前分类新的sort值
*/
(function getNewSort() {
// 往中间插入
if (prevItemId > 0 && nextItemId > 0) {
thisItemSort = (prevItemSort + nextItemSort) / 2;
}
else if (!prevItemId && nextItemId > 0) {
// 往顶部插入(类似新加)
thisItemSort = nextItemSort + SORT_ADD_UNIT_NUM;
}
else if (prevItemId && !nextItemId) {
// 往底部插入
thisItemSort = (prevItemSort + 0) / 2;
}
})();
拖拽排序示例
备注
注意:采用angular ng-repeat循环显示的列表,若有通过$index作为下标进行增删改查等操作,则不建议在view视图层上直接使用sort排序(因为sort排序改变的仅仅是视图层显示的顺序),建议先对数据进行排序处理后再渲染到view视图层上,否则很容易出现controller层操作的项非视图层选择的项。