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

LightSwitch HTML Details Pickers not consistently with autocomplete

亲爱的,

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

自动完成:

没有自动完成:

有没有人以前遇到过这个问题,或者知道如何强制所有细节选择器自动完成?我正在使用最新的 VS Lightswitch 2015。感谢任何帮助

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

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

确定详细信息选择器是否使用可搜索 auto-complete 选项呈现的特定库代码位于详细信息选择器的 _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) 还是呈现为更简单的 drop-down 选择 (false)。

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

1) 函数_isReadOnlyOrDisabled returns true

如 LightSwitch 库的以下摘录所示,如果 contentItem 控件在呈现时被禁用或设置为 read-only,则此函数可能 return 为真:

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' 属性 而不是与详细信息选择器关联的 Table。如下图,你可以在table设计器中通过将焦点设置到table:

来查看这个设置