Templates Angular 2模板:定义回调

Templates Angular 2模板:定义回调,templates,angular,Templates,Angular,我将创建一个现实世界问题的简化示例,假设我有一个列出对象的组件 它接受输入@input()objects:Object[]和@input label:Function,这样它就可以输出每个对象的标记,每个对象的返回值为label 标签应该是一个创建字符串的函数,具体取决于对象,以便子组件在显示每个对象时尽可能灵活。 如id+title或这是项目+编号或项目+标题+成本+成本+“$” 实用的标签可以是e=>e.id+:“+e.title,其中e(标签的参数是对象的相应项) 现在,我想在另一个组件的

我将创建一个现实世界问题的简化示例,假设我有一个列出对象的组件

它接受输入
@input()objects:Object[]
@input label:Function
,这样它就可以输出每个
对象的标记,每个
对象的返回值为
label

标签
应该是一个创建字符串的函数,具体取决于对象,以便子组件在显示每个对象时尽可能灵活。 如
id+title
这是项目+编号
项目+标题+成本+成本+“$”

实用的
标签
可以是
e=>e.id+:“+e.title
,其中
e
(标签
的参数是
对象的相应项

现在,我想在另一个组件的模板A中使用这个组件B,而不向A的组件类添加
label
函数,因为这会使A的组件类非常混乱。我想在模板中定义
标签
函数,例如使用

<my-selector [objects]="myObjects" [label]="e => e.id + ': ' + e.title"

无法在模板中明确定义函数,但可以在组件类中定义它:

constructLabel(e): string {
    console.log('Constructing label...');
    return e.id + ': ' + e.title;
};
绑定指针:

[constructLabel]="constructLabel"
并在子组件中调用它:

export class ChildComponent implements AfterViewInit {

    @Input() constructLabel: Function;

    constructor() { }

    ngAfterViewInit() {
        let e = {};
        this.constructLabel(e); // => Constructing label...
    }
}

据我所知,目前无法在Angular 2模板内定义函数。因此,您必须在组件中定义函数

constructLabel(e): string {
  return e.id + ': ' + e.title;
};
并通过

[label]="constructLabel"

只需创建一个函数并传递该函数,而不是
e=>e.id+:'+e.title
为什么要将函数作为输入传递给子组件?如上所示,
label
是一个函数。鼓励将值作为输入传递。如果您希望访问子组件中的函数,则始终可以使用该子组件的实例来访问该函数。我希望这样做,因为子组件在呈现对象的方式上应该是灵活的。我相应地更新了这个问题。我添加了一个解释,解释了为什么它必须是一个函数,当然,您的第二个解决方案是有效的,但是我声明我不想用额外的函数来混乱组件,而是直接在模板中定义它。所以我的问题是,如果不将函数添加到组件类中,这是否可行。无法从模板中定义函数,我也看不到这样做的有效原因。但是,如果需要在子组件中执行该函数,可以在父组件中定义该函数,并在模板中绑定指针。我将更新我的答案并演示它。那么我的问题的正确答案是
这可能实现吗?如果不可能,解决这个问题的最佳方法是什么?
将是
不可能,最好的解决方案是在组件中编写函数
。谢谢,如果您进行相应更新,我将接受您的回答。
[label]=“constructLabel(e)”
将立即调用函数并传递结果
[label]=“constructLabel”
将函数传递给子组件。