【问题标题】:angular generate routing link角度生成路由链接
【发布时间】:2020-06-26 17:01:23
【问题描述】:

我对 Angular 很陌生,如果不导航到它,我不知道如何以编程方式生成路由链接。

我正在使用 angular-slickgrid,我在某些列上有一个自定义格式化程序,需要生成一些 HTML 来呈现单元格,我想在其中有一个指向单独组件的链接:

const formatZoneCell: Formatter = (row: number, cell: number, value: any, columnDef: Column, dataContext: any, grid?: any) =>
{
  if (value === undefined) { return (""); }
  var zone = 0;
  return (`<span>${value} - <a ?>details</a></span>`);
}

我已经尝试了一些东西,在哪里?是,就像 '[routerLink]="[...]"' 但显然它没有得到评估。 该函数有没有办法在返回之前生成链接,还是我必须对其进行硬编码?

我知道一个解决方案是有一个 onclick 事件并调用一个函数,然后调用 router.navigate,但我没有这样做,因为我想这会生成用户看不到的链接悬停。

奖励问题,如果有人知道使用 angular-slickgrid 为每个单元格定义上下文菜单的方法,我将不胜感激。 看起来有一些上下文菜单选项,但似乎没有一个很好的方法来知道单击了哪个单元格,这就是为什么我试图通过格式化程序在单元格本身中添加一个链接,但这不是很好漂亮。

我希望能够在该右键单击菜单中添加一个条目“详细信息”,该条目将链接到我的其他页面,并具有适当的参数,具体取决于右键单击的单元格。

【问题讨论】:

    标签: javascript angular angular-slickgrid


    【解决方案1】:

    注意,我是 Angular-Slickgrid 的作者

    您不应该在 Formatter 中添加 href 链接,它不安全(XSS 注入,如 &lt;script&gt; 标签)并且它不应该被信任,您也不想使用普通的 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;
        }
    }
    

    在视图中,我通过(sgOnClick) 观看单元格click 事件

    <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 获得grid,并使用常规的 SlickGrid 方法获得大部分您想要的东西。

    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 更改为 col-sm-8 和侧边栏到col-sm-4,然后调用网格调整大小(当我关闭它时,反之亦然)。如果他们点击虚假的超链接列,我们的侧边栏就像另一端的快速视图(精简的详细信息页面)打开完整的用户详细信息页面。

    您还可以通过上下文菜单、网格菜单等重用此概念...

    试一试...如果你喜欢这个库,请给它一个 Star upvote ;)

    【讨论】:

    • 您好,感谢您提供非常详细的回答!但听起来单元格中的任何点击都会触发重定向,这意味着用户将无法轻松复制单元格的内容,对吗?我们还有其他以这种方式工作的应用程序,它们让我发疯。但我猜上下文菜单确实有一个用于此目的的复制选项,所以如果我只是养成使用它的习惯,那就太好了。我今天会试一试并报告,谢谢!
    • 我实际上非常喜欢侧边栏的想法,所以我同意了。当用户单击单元格时,使用您的 onClick 示例打开侧边栏(也使用从引导程序更改 col-x),就像一个魅力。再次感谢!
    猜你喜欢
    • 2016-07-30
    • 2019-05-11
    • 2019-05-20
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2013-05-07
    • 2021-07-21
    • 2019-01-22
    相关资源
    最近更新 更多