【发布时间】:2017-12-14 03:27:32
【问题描述】:
以下代码有效(以任何拼写错误为模——实际代码要复杂得多)。当您单击包含该指令的 DOM 元素时,表达式的值会显示在警报中。
@Directive({selector: '[alertOnClick]'})
export class AlertOnClick implements OnDestroy {
@Input('alertOnClick') clickFunction: (() => string);
@HostListener('click')
onClick() {
alert(this.clickFunction());
}
}
问题是,它必须像这样调用:
<button [alertOnClick]="() => String(new Date())">Time</button>
编辑:Angular 解析器似乎不支持匿名函数。它必须通过命名控制器上的函数来调用。
我想更自然地调用它,像这样:
<button [alertOnClick]="String(new Date())">Time</button>
但是,如果有任何类似的变化,无论何时单击按钮,都会显示相同的时间,即呈现页面的时间。我一生都无法弄清楚如何在我喜欢的时间而不是在呈现页面时评估表达式。有什么建议吗?
【问题讨论】:
-
那么,你想传递任意值,不限于 Angular 表达式支持什么?这似乎是个坏主意。现代 JavaScript 使用从模块中导入的类/变量,而不是全局变量,因此您将无法使用非全局定义的类传递任何内容。你想达到什么目的?
-
如果您只是想传递一个角度表达式,只需将输入的类型更改为
any,将其重命名为message,然后使用alert(this.message);:plnkr.co/edit/3DTNuJAx4fUAH6Umy4nF?p=preview跨度> -
@JBNizet -- 哈哈哈,我看到了你的困惑。由于我的示例显示了一个没有副作用的函数,因此您认为只要在警报之前立即调用它就可以随时调用它。你的
now()函数被一遍又一遍地调用。见这里:plnkr.co/edit/UFQyg9lkhW5ry3eFnXe4 -- 我需要控制它何时执行,因为它有副作用。 -
所以,基本上,你想要
-
请编辑您的问题并详细说明。说明你真正想要达到的目标。
标签: angular