Как отрендерить Angular routerLink внутри ячейки ag-Grid?

Ссылка, которую я пытаюсь отобразить, выглядит так, когда я просто пытаюсь отобразить ее на базовой HTML-странице:

<a [routerLink] = "['/leverance/detail', 13]">A new link</a>

Пытаясь отрендерить его в ag-Grid, я делаю как показано ниже:

SRC \ приложение \ leverancer \ leverancer.component.ts

ngOnInit() {
    this.dataGridColumnDefs = [
          { 
            headerName: 'Type', 
            field: 'leveranceType.name', 
            width: 150,
            cellRenderer: this.customCellRendererFunc       
          }
    ];
}

customCellRendererFunc(params): string {
  const cellContent `<a [routerLink] = "['/leverance/detail', 13]">A new link</a>`;
  return cellContent;
}

но я не вижу работающего routerLink в моем ag-Grid. Можете ли вы сказать мне, что мне нужно сделать, чтобы отобразить работающий routerLink в моем ag-Grid?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
6
0
5 296
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я думаю, что cellRenderer поддерживает только обычный HTML (без каких-либо специфичных для angular вещей).

Вы хотите использовать cellRendererFramework, как показано в этих примерах:

Поскольку вы используете RouterLink, вам, вероятно, понадобится RouterModule в moduleImports.

Спасибо за подсказку :) Нашел ресурс Майкла Карена, где, видимо, он использует cellRendererFramework и делает RouterLinkRendererComponent: medium.com/ag-grid/…stackblitz.com/edit/…

Rune Hansen 19.12.2018 16:37

Вот решение. Я пробовал его с угловой 7, и он у меня отлично работает.

Сетка ag предоставляет события, и два из них - обратные вызовы onCellClicked и cellRendere.

Проблема с onCellCliecked и cellRendere в том, что они работают на JS. поэтому объект это, связанный с этими обратными вызовами, будет экземпляром JS.

Но для вызова функций angular или маршрутизации любого URL-адреса нам понадобится экземпляр компонента angular, который недоступен в этих обратных вызовах.

Итак, вот решение, позволяющее заставить этот экземпляр angular работать с компонентом.

Typescript сохраняет экземпляр текущего объекта в _это всякий раз, когда это недоступен. мы можем получить экземпляр углового компонента с помощью

const self = eval('_this');

этот себя будет содержать экземпляр компонента angular, поэтому мы можем вызывать любую функцию или службу из компонента angular, а также мы можем self.router.navigateByUrl(url)

вот пример

{field: 'plan', headerName: 'Plan Case', sortable:true,filter:true,
  cellRenderer:function(paramObj){
    //for making cell as link
    return `<a href = "javascript:void(0)" >Plan Case</a>`;
  }, 
  onCellClicked:function(data){
    const self = eval('_this');
    //navigating on clicking on cell
    self.router.navigateByUrl('YOUR_URL');
  }  
},

В качестве альтернативы вы можете вызвать любую угловую функцию из события onCellClicked. пример

onCellClicked:function(data){
        const self = eval('_this');
        //calling test function from angular component.
        self.test(data.data);
      } 

Спасибо

Я создал общий компонент, который можно использовать для любой ячейки ссылки.

использование

columnDefs = [
  {
    colId: 'My Column',
    cellRendererFramework: AgGridLinkCellComponent,
    cellRendererParams: {
      // `text` and `link` both accept either an string expression (same as `field`) or a function that gets ICellRendererParams
      text: 'title',
      link: (params: ICellRendererParams) => `/my-path/${_.get(params, 'data.id')}`
    }
  }
]

Зарегистрируйте компонент в вашем AppModule:

imports: [
    AgGridModule.withComponents([
      AgGridLinkCellComponent
    ])
]

Сам компонент:

import * as _ from 'lodash';
import {Component} from '@angular/core';
import {AgRendererComponent} from 'ag-grid-angular';
import {ICellRendererParams} from 'ag-grid-community';

@Component({
  selector: 'app-ag-grid-link-cell-component',
  template: '<a [routerLink] = "link">{{ text }}</a>',
})
export class AgGridLinkCellComponent implements AgRendererComponent {
  link: string;
  text: string;

  constructor() {
  }

  agInit(params: ICellRendererParams): void {
    this.refresh(params);
  }

  refresh(params: ICellRendererParams): boolean {
    const dataParams = params.colDef.cellRendererParams;
    this.link = _.isFunction(dataParams.link) ? dataParams.link(params) : _.get(params.data, dataParams.link);
    this.text = _.isFunction(dataParams.text) ? dataParams.link(params) : _.get(params.data, dataParams.text);
    return false;
  }
}

Другие вопросы по теме