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:
来查看这个设置
亲爱的,
每当我在 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:
来查看这个设置