LightSwitch HTML详细信息选择器与自动完成功能不一致

时间:2017-01-28 17:12:28

标签: visual-studio-lightswitch lightswitch-2013

逗人,

每当我在UI上有导航属性时,lightswitch默认会分配一个详细信息选择器控件。 问题是有时候细节选择器会自动完成,有时它不会,为什么会这样做我仍然不知道。

自动完成:

enter image description here

没有自动完成:

enter image description here

之前是否有人遇到此问题,或者知道如何强制所有细节选择器自动完成?我正在使用最新的VS Lightswitch 2015.感谢任何帮助

1 个答案:

答案 0 :(得分:2)

为了尝试理解为什么会发生这种情况,最好考虑确定此行为的LightSwitch框架代码。

LightSwitch框架库可以在项目的Scripts \ msls - ?。?。?。js文件中找到(问号将反映您正在使用的LightSwitch库的版本,例如msls-2.5.4.js是2015年11月发布。)

确定细节选择器是否使用可搜索的自动完成选项进行渲染的特定库代码位于详细信息选择器的_attachViewCore函数中。下面列出了此例程的相关部分,重点是覆盖isSearchable的值(在_attachViewCore函数的开头初始化为false):

if (!_isReadOnlyOrDisabled(me) &&
    !!me.data && !!me.data.valueModel && !!me.data.valueModel) {
    propertyModel = me.data.valueModel;
    if (propertyModel) {
        isSearchable = !msls_getAttribute(propertyModel.propertyType, ":@NotSearchable");
    }
}

执行此代码后,isSearchable的值确定DetailsPicker是呈现为普通的可搜索选择器(true)还是更简单的下拉选择(false)。

基于此,以下因素可能导致选择器呈现为更简单的下拉控件:

1)函数_isReadOnlyOrDisabled返回true

如以下LightSwitch库摘录所示,如果contentItem控件被禁用或在渲染时设置为只读,则此函数可以返回true:

function _isReadOnlyOrDisabled(me) {
    var contentItem = me.data;
    return (!contentItem || !contentItem.isEnabled || contentItem.isReadOnly);
}

如果您有在屏幕创建的功能中设置这些属性的代码,则会发生这种情况。此外,如果在异步操作完成时设置了这些,则可以解释问题的间歇性。例如,如果screen.getRepair promise在contentItem呈现之前完成,或者可以避免该问题,如果promise需要更长时间并且直到contentItem呈现之后才完成,则以下代码会导致问题:

myapp.AddEditRepair.created = function (screen) {
    screen.getRepair().then(function onComplete(r) {
        screen.findContentItem("ClassificationDetailsPicker").isReadOnly = r.UnclassifiedRepair;
        // or
        screen.findContentItem("ClassificationDetailsPicker").isEnabled = !r.UnclassifiedRepair;
    });
};

如果你需要实现这种行为,你应该使用选择器的_postRender例程,例如:

myapp.AddEditRepair.ClassificationDetailsPicker_postRender = function (element, contentItem) {
    contentItem.screen.getRepair().then(function onComplete(r) {
        contentItem.isReadOnly = r.UnclassifiedRepair;
        // or
        contentItem.isEnabled = !r.UnclassifiedRepair;
    });
};

2)无法访问me.data.valueModel

这是最难解释的原因,因为valueModel应该在呈现控件之前初始化。因此,如果您对其他两个选项进行折扣,我建议您发布一个代码示例,用于显示具有详细信息选择器的屏幕(包括myapp.show调用之前的任何数据访问承诺)。

3)属性@NotSearchable设置为false

这不太可能是您的问题的原因,因为此属性的值应该是一致的。这是因为该属性基于与“详细信息选择器”关联的表的“Is Searchable”属性。如下所示,您可以通过将焦点设置为表格来查看表设计器中的此设置:

The 'Is Searchable' table property