0


最近给Waikiki项目(一个Javascript实现的可编辑的speadsheet)添加了单元格公式的功能。比如,可以设置单元的公式来引用其他单元格值,"=C2*(D2+F2)"。

在最初的设计中,由于需求简单没有考虑仔细,采用了以下方案:

当用户更新某个cell的时候,代码会刷新所有其他的cell,如果这些cell的formula属性有值,就会重新计算得到新的值。因为公式都是在每个cell的formula属性中,代码不知道单元格之间有哪些存在公式之间的引用,所以只能全部刷新(当时只考虑有几个特殊单元格要设置公式,这个做法问题不大)。

现在要实现任意单元格的公式编辑,在更新某个单元格,然后全部刷新其他单元格,就会存在这样的问题:

全部刷新是对整个grid做row-by-row的重新计算,前面的单元格要早于后面的单元格计算,如果前面的单元格的公式引用了后面的单元的值,最后的结果是不正确的。

虽然再做一次从下网上的扫描刷新可以解决这个问题,但是对于更加复杂的前后或者左右单元格相互引用带来的问题,还是不能根本解决。因此,我认为这个方案是行不通的。可行的办法是把所有有公式的单元格构建在一颗树上,这样可以知道单元格之间的引用关系。但是Javascript的数据结构太简单,没有树的概念,自己实现肯定会引来更多问题。

请问有什么好的解决办法?

垃圾帖?
提问于2009-01-30 14:22:32
348 2 10
添加评论
1


我想,不应该老是“全部刷新其他单元格”。

最好做一个事件监听机制(这应该是一个面向富应用的js框架/类库的基本要素吧):一个单元格变化,只通知所有监听(在这里,也就是引用了)它的那些单元格。

当然,如果考虑到变化的传递问题,那就复杂了。尤其是要避免相互引用造成无穷递归

简单的做法是,可以做个递归层级的计数器来判断是否发生无穷递归(比如,递归层级超过了100,就明显不正常了)。

另一方面,也不用特意做个“树”,只要在用户输入公式时,追溯被引用的单元格所引用的单元格所引用的单元格……直到没有公式为止。假如发现引用又指回了本单元格,那么输入的公式无效。

永久链接 | 垃圾帖?
回答于2009-05-24 02:48:05
21 2
添加评论




Made with Django.

当前版本: R-0127-20090523

cc-wiki