在过滤器中搜索数据时,我想在搜索结果为空数据集时显示“没有要显示的数据”
语境
在过滤器中搜索数据时,我想在搜索结果为空数据集时显示“没有要显示的数据”
预期行为
显示“没有要显示的数据”消息而不是空消息
当前行为
显示为空
环境
Angular - 8.2.14,Angular-Slickgrid - 2.22.4,TypeScript - 3.7
在过滤器中搜索数据时,我想在搜索结果为空数据集时显示“没有要显示的数据”
在过滤器中搜索数据时,我想在搜索结果为空数据集时显示“没有要显示的数据”
显示“没有要显示的数据”消息而不是空消息
显示为空
Angular - 8.2.14,Angular-Slickgrid - 2.22.4,TypeScript - 3.7
这现在是 Angular-Slickgrid 的一部分(从 version 开始2.23.1
)并且默认启用,您也可以使用 flag 禁用它enableEmptyDataWarningMessage
。您还可以使用新属性emptyDataWarning
Grid Options 提供一些选项(有关更多信息,请参阅EmptyWarning界面)
我也没有使用绝对定位显示的代码,因为这会导致问题,而是使用 class of 搜索 DOM 元素.grid-canvas
并将 a 附加<div>
到该容器,以便它始终位于正确的位置。
这在 SlickGrid 中是不可能的,它只会显示必须适合单元格的数据。
但是,您还有其他选择,我认为您能做的最好的事情就是在网格中间(或顶部)的一个跨度中显示您的文本。您可以查看 SlickGrid示例 - Yahoo Search,它在屏幕中间显示“缓冲...”。最后一点是要知道何时显示它,您可以使用 DataViewonRowCountChanged
事件,该事件将为您提供项目计数。
<span class="empty-data" [hidden]="hasFilteredData">
No data to display
</span>
<angular-slickgrid gridId="grid4"
[columnDefinitions]="columnDefinitions"
[gridOptions]="gridOptions"
[dataset]="dataset"
(sgOnRowCountChanged)="handleOnRowCountChanged($event.detail.eventData, $event.detail.args)">
</angular-slickgrid>
export class MyDemo {
hasFilteredData = true;
handleOnRowCountChanged(e, args) {
this.hasFilteredData = args.current > 0;
}
}
要定位空数据<span>
消息,您可以查看我之前提供的Yahoo Example,他们使用类似这样的内容(您可以使用相关代码)
loader.onDataLoading.subscribe(function () {
if (!loadingIndicator) {
loadingIndicator = $("<span class='loading-indicator'><label>Buffering...</label></span>").appendTo(document.body);
var $g = $("#myGrid");
loadingIndicator
.css("position", "absolute")
.css("top", $g.position().top + $g.height() / 2 - loadingIndicator.height() / 2)
.css("left", $g.position().left + $g.width() / 2 - loadingIndicator.width() / 2);
}
loadingIndicator.show();
});
取它的一部分,我可以实现如下所示
@Component({
styles: ['.empty-data { color: orange; z-index: 9999; position: absolute; }'],
templateUrl: './my-demo.component.html'
})
export class MyDemo {
hasFilteredData = true;
handleOnRowCountChanged(e, args) {
this.hasFilteredData = args.current > 0;
const $grid = $('#grid4');
$('.empty-data')
.css("top", $grid.position().top + 90)
.css("left", $grid.position().left + 10);
}
// or with pure JS
/*
const emptyDataElm = document.querySelector<HTMLSpanElement>('.empty-data');
const grid = document.querySelector<HTMLDivElement>('#grid4');
const gridPosition = grid.getBoundingClientRect();
emptyDataElm.style.top = `${gridPosition.top + 90}px`;
emptyDataElm.style.left = `${gridPosition.left + 10}px`;
*/
}
新的现场演示
您还可以通过将整个代码移动到实用程序服务中来使其完全可重用,这样您就不必在网格中一遍又一遍地复制相同的代码。我们也可以只使用 DOM 来创建/显示/隐藏消息,使其完全动态化并编写一次。
<span class="empty-data">
No data to display
</span>
<angular-slickgrid>...</angular-slickgrid>
@Component({
templateUrl: './my-demo.component.html'
})
export class MyDemo {
handleOnRowCountChanged(e, args) {
// display warning when there's no filtered data
utility.showEmptyDataMessage('#grid4', 'No data to display', args.current === 0 /*, { color: 'red' } */);
}
}
// utility.ts
/**
* Display a warning of empty data when the filtered dataset is empty
* NOTE: to make this code reusable, you could (should) move this code into a utility service
* @param gridSelector - HTML Selector of the grid <div>
* @param emptyMessage - empty data message to display in the <span>
* @param isShowing - are we showing the message?
* @param options - any styling options you'd like to pass like the text color
*/
export function showEmptyDataMessage(gridSelector: string, emptyMessage: string, isShowing = true, options?: { color: string; class: 'empty-data' }) {
const emptyDataClassName = options && options.class || 'empty-data';
let emptyDataElm = document.querySelector<HTMLSpanElement>(`.${emptyDataClassName}`);
const grid = document.querySelector<HTMLDivElement>(gridSelector);
if (!emptyDataElm) {
emptyDataElm = document.createElement('span');
emptyDataElm.className = emptyDataClassName;
emptyDataElm.textContent = emptyMessage;
document.body.appendChild(emptyDataElm);
}
if (isShowing) {
const gridPosition = grid.getBoundingClientRect();
emptyDataElm.style.top = `${gridPosition.top + 90}px`;
emptyDataElm.style.left = `${gridPosition.left + 10}px`;
emptyDataElm.style.color = options && options.color || 'orange';
emptyDataElm.style.zIndex = '9999';
emptyDataElm.style.position = 'absolute';
emptyDataElm.style.display = 'inline';
} else {
emptyDataElm.style.display = 'none';
}
}