如果子视图/表单未打开,K2 Smartforms仅执行操作

时间:2018-04-17 23:45:37

标签: k2 k2-smartforms

我有一个带有列表视图的K2 SmartForm(v4.7),以及一个刷新该视图中数据的计时器。但是,当子窗体(或子视图)在基本窗体顶部打开并且计时器打勾时," loading"在刷新列表时,指示符和白框会覆盖报名表。

是否可以在子窗体下显示加载面板,或者将规则应用于计时器的tick事件以检查子窗体是否打开?

我意识到在子窗体打开时可以让规则停止计时器,并在关闭时再次启动它,但是有多个子窗体和视图可以在这个应用程序中显示,它会很多更容易简单地让计时器滴答事件检查是否有任何东西打开。

2 个答案:

答案 0 :(得分:1)

好的,所以这里有一些JavaScript魔法,@ nigel-whatling:

我已在名为ckIsSubOpen的表单中添加了一个复选框控件。然后在计时器的滴答事件中,我将一些javascript传递给数据标签(文字),它将调用一个函数(在视图初始化事件上设置)来设置控制值。然后,规则中的下一个操作将检查是否选中了该复选框,如果其值为false,则将运行refresh命令。

这很棘手,因为你不能简单地操纵DOM元素并让K2获得价值变化。根据{{​​3}},存储为页面变量的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-formsub-view类的任何div:

customUpdateSfControl('ckIsSubOpen', ($('div.sub-view, div.sub-form').length > 0));

这似乎符合我的需要。

答案 1 :(得分:0)

您可以在子视图和子表单事件(如Initialize)以及关闭时设置规则。你可以用那些跟踪。但是你仍然需要为每个子视图/子表单执行此操作。

除此之外,我认为你必须做一些JavaScript魔术。