在屏幕创建的事件中调用showTab

时间:2017-03-08 06:58:22

标签: html5 visual-studio-lightswitch lightswitch-2013

我正在使用LightSwitch HTML,我有一个带有多个标签的屏幕,在屏幕'created'事件中,我想根据某些逻辑显示其中一个标签:

var tr = "<tr>";
tr += "<td>"+data['no']+"</td>";
tr += "<td>"+data['s_taggal']+"</td>";
tr += "<td>"+data['silo']+"</td>";
tr += "<td>"+data['sensor1']+"</td>";
tr += "<td>"+data['sensor2']+"</td>";
tr += "<td>"+data['sensor3']+"</td>";
tr += "<td>"+data['sensor4']+"</td>";
tr += "<td>"+data['sensor4']+"</td>";
tr += "<td>"+data['sensor6']+"</td>";
tr += "<td>"+data['sensor7']+"</td>";
tr += "<td>"+data['sensor8']+"</td>";
tr += "<td>"+data['sensor9']+"</td>";
tr += "</tr>";
$("#table_s tbody").append(tr);

然而,当我打开屏幕时会抛出错误:

myapp.MyScreen.created = function (screen) 
{
     if (/* some logic */) {
         screen.showTab("TabOne");
     } else {
         screen.showTab("TabTwo");
     }
}

是否有人遇到此问题并找到了解决方法?

感谢您的帮助,

1 个答案:

答案 0 :(得分:1)

为了在屏幕创建的事件中使用showTab API命令,需要延迟其使用,直到屏幕完全显示。

这可以通过结合使用jQuery mobile pagechange event(因为LightSwitch HTML客户端使用jQuery mobile)和setTimeout with a zero timeout(延迟showTab直到呈现加载屏幕)来实现。

以下显示了使用此方法的示例的修订版本:

myapp.MyScreen.created = function (screen) {
    $(window).one("pagechange", function (e, data) {
        setTimeout(function () {
            if (/* some logic */) {
                screen.showTab("TabOne");
            } else {
                screen.showTab("TabTwo");
            }
        });
    });
};

除了更高级的替代方案之外,我在以下帖子的回答中更详细地介绍了这种方法:

LightSwitch Tabbed screen in Browse template

但是,由于此方法基于延迟showTab直到初始屏幕完全显示,因此确实会导致从默认选项卡到showTab方法显示的选项卡的显着转换。

虽然稍微涉及一些,但如果您希望避免这种明显的转换,则可以自定义LightSwitch库以在标准showScreen方法中引入新选项。此新选项将允许在显示屏幕时指定所需的标签页名称。

如果您想介绍这个附加选项,您需要通过在HTML客户端的default.htm文件中进行以下更改来引用LightMwitch库的未缩小版本(从中删除.min)库脚本参考结束):

<!--<script type="text/javascript" src="Scripts/msls-?.?.?.min.js"></script>-->
<script type="text/javascript" src="Scripts/msls-?.?.?.js"></script>

上面一行中的问号将与您正在使用的LightSwitch版本有关。

然后,您需要在Scripts / msls中找到代码部分 - ?。?。?。js文件,声明showScreen函数并按如下所示进行更改:

function showScreen(screenId, parameters, options) {
    //return msls_shell.showScreen(
    //    screenId, parameters, null, false,
    //    options ? options.beforeShown : null,
    //    options ? options.afterClosed : null);
    return msls_shell.showScreen(
        screenId, parameters, 
        options ? options.pageName : null, 
        false,
        options ? options.beforeShown : null,
        options ? options.afterClosed : null);
}

然后,您可以在任何标准屏幕显示方法中使用此新的pageName选项,如下所示:

msls.application.showScreen("MyScreen", null, { pageName: "TabOne" });
// or
myapp.showScreen("MyScreen", null, { pageName: "TabOne" });
// or
myapp.showMyScreen(null, { pageName: "TabOne" });

这会导致屏幕显示在所需的选项卡上,而没有明显的默认选项卡转换。