我有一个带有列表视图的 K2 SmartForm (v4.7),以及一个刷新该视图中数据的计时器。但是,当在基本表单顶部打开子表单(或子视图)并且计时器滴答作响时,“加载”指示器和白框会在刷新列表时覆盖输入表单。
有没有办法让加载面板显示在子表单下,或者将规则应用于计时器的滴答事件以检查子表单是否打开?
我意识到可以有一条规则在子窗体打开时停止计时器,并在它关闭时重新启动它,但是这个应用程序中可以显示多个子窗体和视图,简单地让计时器打勾会容易得多事件检查是否有任何东西打开。
我有一个带有列表视图的 K2 SmartForm (v4.7),以及一个刷新该视图中数据的计时器。但是,当在基本表单顶部打开子表单(或子视图)并且计时器滴答作响时,“加载”指示器和白框会在刷新列表时覆盖输入表单。
有没有办法让加载面板显示在子表单下,或者将规则应用于计时器的滴答事件以检查子表单是否打开?
我意识到可以有一条规则在子窗体打开时停止计时器,并在它关闭时重新启动它,但是这个应用程序中可以显示多个子窗体和视图,简单地让计时器打勾会容易得多事件检查是否有任何东西打开。
好的,这里有一些 JavaScript 魔法,@nigel-whatling:
我在名为ckIsSubOpen
. 然后在计时器的滴答事件中,我将一些 javascript 传递到数据标签(文字)中,该标签将调用一个函数(在视图初始化事件上设置)来设置控件值。然后规则中的下一个操作检查该复选框是否被选中,如果它的值为 false,将运行刷新命令。
这变得很棘手,因为您不能简单地操作 DOM 元素并让 K2 获取值更改。根据这个线程,有一个存储为页面变量的 XML 文档,以及一个方便的函数来操作这些值:
function customUpdateSfControl(controlName, value) {
var myTextBoxXPath = 'Controllers/Controller/Controls/Control[@Name=\"' + controlName + '\"]';
var windowToUse = window;
if (!checkExists(windowToUse.viewControllerDefinition)) {
windowToUse.viewControllerDefinition = $xml(windowToUse.__runtimeControllersDefinition);
}
var myControl = windowToUse.$sn(windowToUse.viewControllerDefinition, myTextBoxXPath);
var controlInfoObj = new windowToUse.PopulateObject(null, value, myControl.getAttribute('ID'));
windowToUse.executeControlFunction(myControl, 'SetValue', controlInfoObj);
windowToUse.raiseEvent(myControl.getAttribute('ID'), 'Control', 'OnChange');
}
设置字段值的脚本检查任何具有sub-form
orsub-view
类的 div:
customUpdateSfControl('ckIsSubOpen', ($('div.sub-view, div.sub-form').length > 0));
这似乎适合我的需要。
您可以对子视图和子窗体事件(例如 Initialize)以及它们关闭时设置规则。您可以使用这些进行跟踪。但是您仍然必须为每个子视图/子表单执行此操作。
除此之外,我认为你必须做一些 JavaScript 魔术。