Javascript 如何避免在数据更改时完全刷新小部件?

Javascript 如何避免在数据更改时完全刷新小部件?,javascript,widget,iccube-reporting,Javascript,Widget,Iccube Reporting,在iCube Reporting V6中,我基于iCube的示例创建了一个模板小部件。因此,我将所有JS代码都放在渲染后的事件中 我希望在小部件创建时定义和默认一些变量,这些变量可以在整个报告的使用过程中更改,并用作此小部件中的参数 问题是,每次数据更改时,小部件都会被完全刷新和重建,并将我的变量重置为默认值 它是否缺少可以初始化小部件和变量的initwidget事件?那么,接收到的数据上的和渲染后的事件将仅用于管理数据操作和渲染?(关于这些变量) 或者…我只是做得不对吗?每次我们获得新数据或小

在iCube Reporting V6中,我基于iCube的示例创建了一个模板小部件。因此,我将所有JS代码都放在渲染后的
事件中

我希望在小部件创建时定义和默认一些变量,这些变量可以在整个报告的使用过程中更改,并用作此小部件中的参数

问题是,每次数据更改时,小部件都会被完全刷新和重建,并将我的变量重置为默认值

它是否缺少可以初始化小部件和变量的
initwidget
事件?那么,接收到的数据上的
和渲染后的
事件将仅用于管理数据操作和渲染?(关于这些变量)

或者…我只是做得不对吗?

每次我们获得新数据或小部件的某个属性发生更改时,都会调用Render事件。最新的是罕见的,但如果某些属性是使用事件定义的,则可能是最新的

我们需要的是在此方法上添加一个状态,以检查小部件是否已经呈现。这可以通过两种方式完成,使用jquery检查dom是否已更改或添加javascript对象

第一种方法很容易使用jquery,如果不需要缓存javascript对象,应该使用它。对于第二个问题,我们有两种解决方案:

1) 我们可以使用jquery将javascript对象绑定到html元素():

2) 由于icCube 6.0.4,您还可以使用上下文获取本地状态对象context.widgetState()

您可以检查一个工作示例:

  var state = $node.data("widgetState");
    if ( state ) {
        // it's not the first time
        state.times = state.times+1;
        $node.html("It's the " + state.times + " time you clicked " );
    }
    else
    {
        // it's the first time
        $node.html("It's the first time you clicked, don't be shy" );
        state = { times : 1 } ;
        $node.data("widgetState", state);
    }