起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3414|回复: 9

[处理中3] 关于list中对li进行拖拽的问题

[复制链接]

165

主题

626

帖子

1160

积分

金牌会员

Rank: 6Rank: 6

积分
1160
QQ
发表于 2017-7-26 17:35:43 | 显示全部楼层 |阅读模式
本帖最后由 邹胖胖 于 2017-7-26 17:49 编辑

我的布局是这样:我用div把页面分成左右两块,两边都放的<list>,我在list中<li>中放了人像照片和人员姓名,姓名显示在图片的下方,将左边的<li>拖拽到右边的list中表示选择该条信息,并将该条信息增加到右边的<list>对应的data中,同时从左边的<list>对应的data中删除;反之,从右边拖拽到左边表示取消选择,并将数据增加到左边的data,同时将数据从右边的data中删除。关于拖拽我仿照3.6版本中你们的案例写的,现在有一下几个问题:
源代码:
  1. Model.prototype.dragAdd = function(){
  2.     var id = this.getIDByXid("wxz");
  3.     touch.on('#' + id,'touchstart',function(ev){
  4.         ev.preventDefault();
  5.     });
  6.     var dx,dy;
  7.     touch.on('#' + id,'drag',function(ev){
  8.         dx = dx || 0;
  9.         dy = dy || 0;
  10.         var offfx = "0px";
  11.         var offy = "0px";
  12.         //判断是已经将元素拖拽到了屏幕之外去了
  13.         if(dx + ev.x > window.innerWidth){
  14.             offx = window.innerWidth;
  15.         } else{
  16.             offx = dx + ev.x;
  17.         }

  18.          if(dy + ev.y > window.innerHeight){
  19.             offy = window.innerHeight;
  20.         } else{
  21.             offy = dy + ev.y;
  22.         }
  23.         this.style.webkitTransform = "translate3d(" + offx + "," + offy + ",0)";
  24.     });

  25.     touch.on('#' + id,'dragend',function(ev){
  26.           //再次判断元素是否被拖拽到屏幕之外去了
  27.           if(dx + ev.x > window.innerWidth){
  28.                dx = window.innerWidth;
  29.           }else{
  30.                dx += ev.x;
  31.           }

  32.           if(dy + ev.y > window.innerHeight){
  33.                dy = window.innerHeight;
  34.           }else{
  35.                dy += ev.y;
  36.           }
  37.     })
  38. }
复制代码


1.按照你们的案例中的写法,就是在onLoad方法中调用dragAdd 方法,根据给定的xid,对元素的拖拽进行监听,但是我的list中每个li的xid都是一样的,那每次用的dx和dy都是上一次拖动完给定的值,就造成了,如果每次退拽的<li>都是一个的话,可以正常拖拽,如果每次拖拽的<li>不一样,那dx和dy就不是本次拖拽的<li>的正确x和y值;
2.我的Xid是<li>的,那监听的应该是整个<li>元素,可是为什么拖拽的时候只拖动了图片,没有连同姓名一起拖拽呢?
3.我在代码中判断元素是否被拖拽出了屏幕,但是没有生效,还是被拖到屏幕外部去找不到了,怎么将退拽的范围控制在整个屏幕内?
4.我想实现的是在完成拖拽后不是将元素放在我停留的位置,而是判断该元素所处位置是否在左边或右边的div里,然后去取得当前拖拽的<li>元素对应的row,再去进行业务处理,将退拽过来的元素增加到对应的<list>对应的data中去,这样的话元素也会被正正方方地放到<list>里面。

发表于 2017-7-26 18:18:58 | 显示全部楼层
1.
因为list 默认生成的id也是一样的! 所以list 的li上 可以通过bind-attr-id 属性 绑定一个 data字段,表示唯一id
可以绑定id列字段,或者重新使用计算列,设置默认值为uuid  ,(计算规则就可以设置)
bind-attr-id  绑定 字段值最终会生成在 li标签的id列属性里,

可以在list渲染完以后  data.each循环获取这个字段的值!调用touch.on('#' + id、、 方法!
这样每个ID都不重复了,

2.拖动整体,可以参考:http://docs.wex5.com/wex5-app-question-list-2074/

3. 需要自己在拖拽的事件中,判断当前dom原素所在的位置,如果超出位置,就用代码动态指定dom元素所在位置坐标!保证它不要超出,

4. 根据我第一条说的,可以获取这个dom原始的id的值!查询出他的行对象!获取到行对象就能得到行索引!
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

165

主题

626

帖子

1160

积分

金牌会员

Rank: 6Rank: 6

积分
1160
QQ
 楼主| 发表于 2017-7-26 18:29:27 | 显示全部楼层
liangyongfei 发表于 2017-7-26 18:18
1.
因为list 默认生成的id也是一样的! 所以list 的li上 可以通过bind-attr-id 属性 绑定一个 data字段,表 ...

其他几个问题的我明白了,但是第三个问题我已经做了判断了啊,你看的源码里面,不是那样判断吗?
回复 支持 反对

使用道具 举报

发表于 2017-7-26 18:31:54 | 显示全部楼层
邹胖胖 发表于 2017-7-26 18:29
其他几个问题的我明白了,但是第三个问题我已经做了判断了啊,你看的源码里面,不是那样判断吗? ...

这个你debugger调试一下吧!看下这个dom节点的位置跑哪儿去了!自己找下原因!为什么设置没生效

判断条件 是否执行是正确的?
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

165

主题

626

帖子

1160

积分

金牌会员

Rank: 6Rank: 6

积分
1160
QQ
 楼主| 发表于 2017-7-27 09:47:18 | 显示全部楼层
liangyongfei 发表于 2017-7-26 18:31
这个你debugger调试一下吧!看下这个dom节点的位置跑哪儿去了!自己找下原因!为什么设置没生效

判断条 ...

li上面没有bind-attr-id属性啊,是自定义属性吗?我试了自定义bind-attr-id,无法为li动态绑定id
回复 支持 反对

使用道具 举报

发表于 2017-7-27 11:37:09 | 显示全部楼层
邹胖胖 发表于 2017-7-27 09:47
li上面没有bind-attr-id属性啊,是自定义属性吗?我试了自定义bind-attr-id,无法为li动态绑定id ...

是的,自定义。本地测试没问题
  1. bind-attr-id=' val("fID")'
复制代码



A_TK~4DP9}]URKI[7DY7KH6.png
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

165

主题

626

帖子

1160

积分

金牌会员

Rank: 6Rank: 6

积分
1160
QQ
 楼主| 发表于 2017-7-27 11:52:46 | 显示全部楼层
本帖最后由 邹胖胖 于 2017-7-27 12:01 编辑
liangyongfei 发表于 2017-7-27 11:37
是的,自定义。本地测试没问题

我看了下,li的id是绑定上去了,但是在调用touch('#' + id,'touchstart',function(eve){...})的时候报错,说'#...'(对应'#' + id) is not a valid,我看了下id 确实是绑在了li上的;
还有就是在页面的操作中,data会一直在动态的增删,那新增加进来的数据会自动增加拖拽的监听吗?
回复 支持 反对

使用道具 举报

发表于 2017-7-27 14:17:18 | 显示全部楼层
邹胖胖 发表于 2017-7-27 11:52
我看了下,li的id是绑定上去了,但是在调用touch('#' + id,'touchstart',function(eve){...})的时候报错 ...

你需要等待list渲染完以后,再调用touch(' 方法关联 li
list渲染完的判断
http://docs.wex5.com/wex5-ui-question-list-2171


如果存在动态新增的数据!默认是不会再执行touch('#' + id,'的!
如果想每次渲染的新数据都能自动添加上绑定,建议在list组件的onAfterRender 事件中,获取最新的li 的id ,然后再调用!
http://docs.wex5.com/wex5-ui-question-list-2006/
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

165

主题

626

帖子

1160

积分

金牌会员

Rank: 6Rank: 6

积分
1160
QQ
 楼主| 发表于 2017-7-27 14:29:34 | 显示全部楼层
liangyongfei 发表于 2017-7-27 14:17
你需要等待list渲染完以后,再调用touch(' 方法关联 li
list渲染完的判断
http://docs.wex5.com/wex5-ui ...

坛主,你知道不知道怎么获取元素被拖动后的x和y的坐标的方法啊?我查了好久也没弄出来,这个解决了我的问题就解决了
回复 支持 反对

使用道具 举报

发表于 2017-7-27 15:21:47 | 显示全部楼层
邹胖胖 发表于 2017-7-27 14:29
坛主,你知道不知道怎么获取元素被拖动后的x和y的坐标的方法啊?我查了好久也没弄出来,这个解决了我的问 ...

这个自己上网搜吧!
http://www.cnblogs.com/shirleyyang-fe/p/5836761.html

坐标一般是指左上角,移动过程中应该还要考虑宽度和高度
上下左右的坐标位置,进行计算!
qq:1912779713
WeX5教程--WeX5下载
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2025-7-10 07:07 , Processed in 0.062407 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表