DOM上的类似电子表格的公式

我正在寻找一种在整个DOM中动态绑定公式的方法。

我们有一个数据密集型应用程序,目前我编写了许多处理程序来尝试重新计算和更新相应的单元格。 但是,这很容易出错。

我看到了可能有能力的东西, 哈希戈 。 但是它在大约一年半的时间里没有更新。

有没有人知道正在积极开发的类似的东西? 我一直在寻找,但这是我设法找到的。

理想情况下,我只需要设置公式,它将处理监视公式中的字段是否已更改,并相应地更新值。

编辑:我也jQuerySheet但它比我可以使用的方式更多,我只需要解析方面的公式。 并且它的计算引擎似乎围绕具有列/行标识符的单元旋转太多。

EDIT2:这个jQuery Calculation插件越来越接近我需要的东西了。

编辑3:最终,我希望能够写出一些简单的东西

$('#output').formula(" ( SUM($('.x')) + $('#y') ) / ( funcThatReturnsValue() + 4 )"); 

只要.x#y中的值发生#output ,就会重新计算#output的值。

但是,我可能会设置一些基本的东西

 $('#output').formula({ formula: "(SUM(x)+y)/(j+k)", variables: { x: $('.x'), y: $('#y'), j: function() { return 3; }, k: 4 } onblur: $('.x, #y') }); 

您可以使用knockout.js来获取您正在寻找的function。

Knockout.js在你的javascript中实现了一个mvvm模式。 以下是他们如何定义MVVM:

MVVM和视图模型模型 – 视图 – 视图模型(MVVM)是用于构建用户界面的设计模式。 它描述了如何通过将可能复杂的UI分为三个部分来简化它们:

模型:应用程序的存储数据。 此数据表示业务域中的对象和操作(例如,可以执行汇款的银行帐户),并且独立于任何UI。 使用KO时,通常会对某些服务器端代码进行Ajax调用,以读取和写入此存储的模型数据。

视图模型:UI上数据和操作的纯代码表示。 例如,如果要实现列表编辑器,则视图模型将是一个包含项列表的对象,并公开添加和删除项的方法。

请注意,这不是UI本身:它没有按钮或显示样式的任何概念。 它也不是持久数据模型 – 它保存用户正在使用的未保存数据。 使用KO时,您的视图模型是纯JavaScript对象,不了解HTML。 以这种方式保持视图模型的抽象使其保持简单,因此您可以管理更复杂的行为而不会丢失。

视图:表示视图模型状态的可见交互式UI。 它显示来自视图模型的信息,将命令发送到视图模型(例如,当用户单击按钮时),并在视图模型的状态发生变化时进行更新。

使用KO时,您的视图只是具有声明性绑定的HTML文档,以将其链接到视图模型。 或者,您可以使用使用视图模型中的数据生成HTML的模板。

因此,您将创建包含电子表格中数据的“模型”,以及重新计算数据所需的任何函数。 然后,您将拥有自己的视图,当用户更改页面上的内容时,视图会自动更新(也就是重新计算)数据。

http://knockoutjs.com

我只是开发解析公式的插件,在其核心使用jison解析器,目前公式仍然限于sum,avg,min和max,但会根据请求添加更多function。

http://xsanisty.com/calx/

你所描述的内容听起来很像Sproutcore或Ember.js的 “Bindings”和“Computed Properties”。

看看jQuery Calculation Plug-in 。 但我不确定你是否可以定义任何公式

你会想要一个像Backbone.js或Knockout这样的框架


Backbone.js的

http://documentcloud.github.com/backbone/

引自Backbone:使用Backbone,您可以将数据表示为模型,可以创建,validation,销毁和保存到服务器。 每当UI动作导致模型的属性发生变化时,模型就会触发“更改”事件; 显示模型状态的所有视图都可以通知更改,以便它们能够相应地响应,使用新信息重新呈现自己。 在完成的Backbone应用程序中,您不必编写查看DOM的粘合代码来查找具有特定id的元素,并手动更新HTML – 当模型更改时,视图只会自行更新。


Knockout.js

http://www.knockoutjs.com/

引自Knockout JS:通过将数据和行为封装到视图模型中,您可以获得一个干净,可扩展的基础,可以在其中构建复杂的UI,而不会迷失在混乱的事件处理程序和手动DOM更新中。

您可以像这样处理问题:

  • 通过$('myDomElement').data('varX',data);存储在你想要保持更新的DOM节点上$('myDomElement').data('varX',data);
  • 通过$("myDomElement").bind("setData", function(key,value){ setTimeout(function() { $("myDomElement").trigger("formula"); },10); return value; });重载该DOM节点的setData方法$("myDomElement").bind("setData", function(key,value){ setTimeout(function() { $("myDomElement").trigger("formula"); },10); return value; });
  • 最后创建更新公式,如$('myDomElement').bind("formula",function() { this.html(foo()); });

Woehoe,我重读了你的post,发现你并没有真正指明你有存储数据的变量……而是你得到了细胞……

  • 在这种情况下,您只需将changeHandler添加到更新公式的单元格中。

嗯,实际上,我想我忘记了问题是什么,似乎有点太明显我想在这里…对不起,如果没有帮助

无论如何……我在数据绑定jquery上做了一个快速谷歌,我发现你可以绑定$ .data上的setData / getData-events: 你可能不知道关于jquery的什么

我也发现了这个,这可能与您的网络安全方法有关,也可能不感兴趣: 使用jquery.data检测表单更改

更重要的是,我同意以前的答案,你总是可以使用一个框架 – 我个人更喜欢jsmvc