在过滤器中搜索数据时,我想在 Angular SlickGrid 中搜索结果为空数据集时显示 "No data to display"
When searching the data in the filter I want to show "No data to display" when search results with empty dataset in Angular SlickGrid
在过滤器中搜索数据时,当搜索结果为空数据集时,我想显示“没有要显示的数据”
上下文
在过滤器中搜索数据时,当搜索结果为空数据集时,我想显示“没有要显示的数据”
预期行为
显示“没有要显示的数据”消息而不是空消息
当前行为
显示为空
环境
Angular - 8.2.14,Angular-Slickgrid - 2.22.4,TypeScript - 3.7
更新 2020-11-18
这现在是 Angular-Slickgrid 的一部分(从版本 2.23.1
开始)并且默认启用,您也可以使用标志 enableEmptyDataWarningMessage
禁用它。您还可以使用新的 属性 emptyDataWarning
网格选项提供一些选项(有关详细信息,请参阅 EmptyWarning 界面)
我也没有使用带有绝对定位的代码,因为这会导致问题,而是使用 .grid-canvas
的 class 搜索 DOM 元素,并且将 <div>
附加到该容器,以便它始终位于正确的位置。
原答案
这在 SlickGrid 中是不可能的,它只会显示必须适合单元格的数据。
但是你有其他选择,我认为你能做的最好的就是在网格中间(或顶部)的范围内显示你的文本。您可以查看 SlickGrid Example - Yahoo Search,它在屏幕中间显示“正在缓冲...”。最后一块是知道何时显示它,您可以使用 DataView onRowCountChanged
事件,它会为您提供项目计数。
<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 到 create/show/hide 消息完全动态并编码一次。
<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';
}
}
在过滤器中搜索数据时,当搜索结果为空数据集时,我想显示“没有要显示的数据”
上下文
在过滤器中搜索数据时,当搜索结果为空数据集时,我想显示“没有要显示的数据”
预期行为
显示“没有要显示的数据”消息而不是空消息
当前行为
显示为空
环境
Angular - 8.2.14,Angular-Slickgrid - 2.22.4,TypeScript - 3.7
更新 2020-11-18
这现在是 Angular-Slickgrid 的一部分(从版本 2.23.1
开始)并且默认启用,您也可以使用标志 enableEmptyDataWarningMessage
禁用它。您还可以使用新的 属性 emptyDataWarning
网格选项提供一些选项(有关详细信息,请参阅 EmptyWarning 界面)
我也没有使用带有绝对定位的代码,因为这会导致问题,而是使用 .grid-canvas
的 class 搜索 DOM 元素,并且将 <div>
附加到该容器,以便它始终位于正确的位置。
原答案
这在 SlickGrid 中是不可能的,它只会显示必须适合单元格的数据。
但是你有其他选择,我认为你能做的最好的就是在网格中间(或顶部)的范围内显示你的文本。您可以查看 SlickGrid Example - Yahoo Search,它在屏幕中间显示“正在缓冲...”。最后一块是知道何时显示它,您可以使用 DataView onRowCountChanged
事件,它会为您提供项目计数。
<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 到 create/show/hide 消息完全动态并编码一次。
<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';
}
}