Angular 单元格渲染器在 init 中没有获得 ICellRendererParams

Posted

技术标签:

【中文标题】Angular 单元格渲染器在 init 中没有获得 ICellRendererParams【英文标题】:Angular cell renderers don't get ICellRendererParams in init 【发布时间】:2021-02-19 16:24:16 【问题描述】:

我正在尝试制作一个单元格渲染器,用于使用 Angular 将 IP 地址制作成可点击的 SSH 链接。渲染器组件:

import  Component, OnInit, OnDestroy  from "@angular/core";
import  DomSanitizer, SafeUrl  from "@angular/platform-browser";

import  ICellRendererAngularComp  from "ag-grid-angular";
import  ICellRendererParams  from "ag-grid-community";

const username = "me";

/**
 * SSHCellRendererComponent is an AG-Grid cell renderer that provides ssh:// links as content.
 */
@Component(
    selector: "ssh-cell-renderer",
    styleUrls: ["./ssh-cell-renderer.component.scss"],
    templateUrl: "./ssh-cell-renderer.component.html"
)
export class SSHCellRendererComponent implements ICellRendererAngularComp 

    /** The IP address or hostname to which the SSH link will point. */
    public get value(): string 
        return this.val;
    
    private val = "";

    /** The SSH URL to use. */
    public get href(): SafeUrl 
        const url = `ssh://$username@$this.value`;
        return this.sanitizer.bypassSecurityTrustUrl(url);
    

    constructor(private readonly sanitizer: DomSanitizer) 

    /** Called by the AG-Grid API at initalization */

    public refresh(params: ICellRendererParams): boolean 
        this.val = params.value;
        return true;
    

    /** called after ag-grid is initalized */
    public agInit(params: ICellRendererParams): void 
        console.log("has value?:", Object.prototype.hasOwnProperty.call(params, "value"));
        console.log("getval:", params.getValue());
        this.val = params.value;
    

然后模板看起来像:

<a [href]="href" target="_blank">value</a>

它应该是非常基本的,我在AngularJS中基本上完全做到了这一点,但它不起作用。这些单元格最终都包含如下所示的实际内容:

<a href="ssh://me@" target="_blank"></a>

我在agInit 中的那两个console.logs 告诉我原因:

16:34:38.554     has value?: false             ssh-cell-renderer.component.ts:62:10
16:34:38.555     getval: undefined             ssh-cell-renderer.component.ts:63:10

我不知道agInit(也可能是refresh)是什么类型的对象,但显然不是ICellRendererParams - 和getValue 也无济于事,因为无论如何原因它总是返回undefined。我可以访问data(从那里我可以看到被渲染的值实际上不是undefined),但是如果我想使用“IPv4 地址”列为 SSH 链接制作渲染器,并且一个“IPv6 地址”列,我需要两个几乎相同的组件,这是很多重复的代码。

那么我错过了什么?

【问题讨论】:

【参考方案1】:

你用的简单吗

const username = "me";
export class SSHCellRendererComponent implements ICellRendererAngularComp 
public username = username;

在你的模板中

<a [href]="sanitizer.bypassSecurityTrustUrl('ssh://' + username +'@'+value)" target="_blank">value</a>

更新

在您的模板中使用 sanitizer 功能或创建 sanitizer 安全管道。

【讨论】:

那行不通。该 URL 将被 Angular 视为不安全,并且无法点击,即使属性已正确计算。 这行得通,但在恢复它检查后我发现我的原始代码似乎突然工作了。我不确定发生了什么变化,但对于任何试图做类似事情的人来说也是如此:注意将鼠标悬停在链接上(至少在 Firefox 中)不会显示用户,例如'ssh://admin@1.2.3.4' 显示在悬停时的小链接地址框中有 'ssh://1.2.3.4'

以上是关于Angular 单元格渲染器在 init 中没有获得 ICellRendererParams的主要内容,如果未能解决你的问题,请参考以下文章

通过自定义单元格渲染器在Jtable中显示超链接

Angular 6 ag-grid 单元格渲染器单击功能

ag-Grid 单元格渲染 - 自定义道具

Angular Ag-grid(值获取器不导出单元格的渲染值)

在一个单元格渲染器中渲染 2 个组件

从数据表中提取渲染的单元格数据