注意,我是 Angular-Slickgrid 的作者
您不应该在 Formatter 中添加 href 链接,它不安全(XSS 注入,如<script>
标签)并且不应该被信任,而且您也不想使用普通的 href,因为这会重新加载整个页面(外部SPA)...您应该做的是使用该click
事件,当单击该特定列时,请执行某些操作。这正是我在我们的项目中所做的,我的 Formatter 使它看起来像一个链接,但实际上用户可以单击单元格中的任何位置(大多数用户永远不会注意到这一点,尤其是如果您的列宽是text) 并从事件处理程序中,您可以在 SPA(单页应用程序)中进行 Angular 路由更改。
所以就像我说的,我有一个自定义格式化程序让它看起来像一个超链接,这里是代码(在我们的例子中是翻译)
import { Formatter, Column } from 'angular-slickgrid';
export const openFormatter: Formatter = (row: number, cell: number, value: any, columnDef: Column, dataContext: any, grid: any) => {
const gridOptions = (grid && typeof grid.getOptions === 'function') ? grid.getOptions() : {};
const translate = gridOptions.i18n;
let output = '';
if (translate && translate.instant) {
const openTxt = translate.instant('OPEN');
const openForDetailTxt = translate.instant('OPEN_FOR_DETAILS');
output = `<span class="fake-hyperlink" title="${openForDetailTxt}">${openTxt}</span>`;
}
return output;
};
对于假超链接,我有这个简单的 SASS 样式
.fake-hyperlink {
cursor: pointer;
color: blue;
&:hover {
text-decoration: underline;
}
}
在视图中,我click
通过(sgOnClick)
<angular-slickgrid
gridId="userGrid"
[columnDefinitions]="columnDefinitions"
[gridOptions]="gridOptions"
(onAngularGridCreated)="angularGridReady($event)"
(sgOnClick)="handleOnCellClick($event.detail.eventData, $event.detail.args)">
</angular-slickgrid>
在组件中,对于单元格单击处理程序,我在列名上做了一个 switch case,当我知道用户点击了该列时,我然后执行我的操作(在下面的示例中,它是列字段userNumber
),args
你可以使用常规的 SlickGrid 方法获得grid
并获得您想要的大部分内容。
handleOnCellClick(event, args) {
const grid = args.grid;
const selectedUser = grid && grid.getDataItem(args.row) as User;
const columnDef = grid && grid.getColumns()[args.cell];
const field = columnDef && columnDef.field || '';
switch (field) {
case 'userNumber':
const url = `/users/${selectedUser.id}`;
// we can also look at the Event used to handle Ctrl+Click and/or Shift+Click
if (event.ctrlKey || event.shiftKey) {
const openUrl = this.location.prepareExternalUrl(url);
window.open(openUrl, '_blank'); // open url in a new Browser Tab
} else {
this.router.navigateByUrl(url); // or open url in same Tab
}
break;
default:
// clicked on any other column, do something else?
// for example in our project we open a sidebar detail view using Bootstrap columns
// this.openSidebar();
break;
}
}
最后一点,为了给你一个更详细的我们项目的描述,如果用户点击有假链接的列,它将执行点击处理程序,通过 switch case 并路由到特定的用户详细信息页面,但是,如果用户单击其他任何地方,它将打开一个侧边栏(我们使用引导列。为了快速解释我如何做一个侧边栏,我只需将带有 Bootsrap 类的网格容器从col-sm-12
tocol-sm-8
和侧边栏更改为col-sm-4
,然后调用网格调整大小(当我关闭它时反之亦然)。我们的侧边栏就像另一端的快速视图(一个精简的详细信息页面),如果他们点击虚假的超链接列,它将打开完整的用户详细信息页面。
您还可以通过上下文菜单、网格菜单等重用这个概念......
试一试……如果你喜欢这个库,还可以点个星号;)