小程序商品分类排序(包括新思路)

@一棵菜菜  April 20, 2018

作者:蔡依辰
说明:对小程序商品分类、首页的轮播图和快捷按钮功能,在添加、拖拽排序时获取sort值,并按sort值从大到小排列。

思路

分类是按自上而下、按sort值从大到小的顺序排列。

分类sort值图:
QQ20180420-114728.png

添加分类时获取其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;
                        }
                    })();

拖拽排序示例

QQ20180420-114743.png

备注

注意:采用angular ng-repeat循环显示的列表,若有通过$index作为下标进行增删改查等操作,则不建议在view视图层上直接使用sort排序(因为sort排序改变的仅仅是视图层显示的顺序),建议先对数据进行排序处理后再渲染到view视图层上,否则很容易出现controller层操作的项非视图层选择的项。


添加新评论