lidatui / mmGrid

mmGird是一个基于jQuery的表格控件
http://lidatui.github.io/mmGrid
225 stars 124 forks source link

建议某些回调是不是可以采用event的方式 #6

Open limodou opened 11 years ago

limodou commented 11 years ago

以前我也是习惯写回调的方式,但这样需要在options中配置回调函数。在bootstrap中,基本上都是使用event的方式来处理。在我写的treegrid插件中也是采用了事件。是否mmGrid也可以使用事件的方式,这样感觉处理会更简单和通用一些。关键是有可能同时绑定多个事件处理函数。

lidatui commented 11 years ago

我看到你的写的代码后也意识到了这一点。我当时在dev分支做了一下试验,发现了一些问题,你感兴趣的话可以看一下。

最先遇到的问题:现在如果标记参数autoLoad为true,那么随后设置的一些加载时就触发的事件会在第一次加载时触发不到。怎么填平这个坑是我现在真正在考虑的。

limodou commented 11 years ago

不太明白。

我想的问题是:象add这样的事件,因为我写的tree不只是为了读,而是为了编辑,所以有可能是在load数据之后才添加的新行,所以这样的add事件是我想要的,但是在load时的事件有可能我不想要。因此我还在考虑如何区分不同的add事件。

lidatui commented 11 years ago

我已经在dev分支加入了insert update和remove的事件,你可以签出一下看看是不是你想要的那种?

还有,我更改了以前的一些方法名,让命名更明确一点

limodou commented 11 years ago

你的事件处理和我还有一些差异。因为我做的treegrid不仅是用来看的,还要可以编辑。所以我的事件处理一般是:

                    e = this._trigger(node, 'up', data);
                    if(e.isDefaultPrevented()) return;

                    n.before(node);
                    this._moveChildren(node);

                    this._trigger(node, 'upped', data);

在处理前先发出事件,然后检查是否被中断,然后进行处理,最后再发出事件。你的处理好象只有处理后的事件。这样有可能无法阻止某些事件。另外我的事件命名接近于bootstrap的方式,使用比如短的单词,处理完使用过去式。比如 add added 之类的。

我的treegrid基本上完成,不过还没到完善的地步,我会在我的应用中不断完善。有兴趣可以参考一下。

lidatui commented 11 years ago

上面是移动节点顺序的例子吗,我想这确实是个复杂的功能。

你的代码对我很有帮助,期待你能完成它。

limodou commented 11 years ago

是的。因为结点移动我实现的是同级结点才可以移动。但是由于存在子结点,所以首先要计算是当前结点的同级结点是哪个,然后再通过递归来实现移动。不过后面我为每个级别添加了一个level的值,我想使用它应该可以计算出哪些连续的结点要移动,可能效率会高一些。等有时间会优化一下。

lidatui commented 11 years ago

level值我觉得可以借助jQuery的selector来实现,把level值变成class,设定两套class,一个深度一个广度。比如下面这样:

group-1 level-1 
        group-1  level-2
                group-1 level-3
                group-1 level-3
        group-1 level-2
group-2 level-1
        group-2 level-2

这样用$('.group-1')就可以取出第一组的根节点和其子节点,用$('.group-1.level-2')就取出第一组的二级节点,用$('.group-1.level-2'). nextUntil('.group-1', '.level-2').就取出.group-1.level-2这个节点的所有子节点了,以此类推(如果我没记错用法的话...)。

这样的话只要获得目标tr元素,然后调用jQuery的before和after或者insertBefore和insertAfter方法就可以直接移动到相应的位置了。但是如果节点深度有变化的话就比较麻烦,那就要改变class了。

limodou commented 11 years ago

实际上和你说的差不多。我是这样实现的:每个tr有一个id的值,标识它的唯一性,这个值是可以配置并且是从数据中来的。然后在add结点时,如果它有父结点,即数据中可能有一个标识父结点的字段,如 _parent 这样我会在子结点上添加一个叫 parent=xxx 的属性,这样就完成了父子结点的处理。然后同时处理level,还是在tr上添加了一个 level=xxx 的属性。所以我是可以直接得到这些值的。你上面写的selector我再学习一下,我一直在考虑怎么循环呢,看看你的方法是不是更好。