【发布时间】:2021-09-02 19:47:46
【问题描述】:
我有一个 Helper 类,它定义了一个静态方法“keyDown”,它获取按下的键。
我在几个组件中使用它,它只是定义为组件类上的一个方法,从模板中调用,如下所示:
<input type="number"
...
(keydown)="keyDown($event)"
pattern="^(\d?[0-9]|[1-9]0)$"
required/>
但是复制那个代码不好,所以我把它放到一个静态类中,如this question中解释的那样
export abstract class Helper {
public static keyDown($event: any) {...}
}
组件:
import { Helper } from '../../../utils/helper';
constructor(
private helper: Helper,
) { }
get keyDown(v) { return Helper.keyDown(v); }
这不起作用,因为您无法将值传递给 getter。
那么我怎样才能拥有一个从不同组件的模板中调用的共享实用程序函数呢?
更新 - 我试过了。
感谢@CharlesBarnes 的评论。这几乎奏效了!
我做了 3 个微妙但重要的改变:
- 类方法不再是静态的:
export abstract class Helper {
public keyDown($event: any) {...}
}
- 注入的帮助器不再是私有的,而是公共的。这意味着模板现在可以查看助手类中的所有方法,因此可以直接调用它们:
import { Helper } from '../../../utils/helper';
constructor(
public helper: Helper,
) { }
- 最后我更改了模板,在方法调用前加上注入类的名称(小写“helper”):
<input type="number"
...
(keydown)="helper.keyDown($event)"
pattern="^(\d?[0-9]|[1-9]0)$"
required/>
但它会抛出一个
NullInjectioNError, no provider for 'Helper'
:(
这种方式意味着将 Helper 类转换为服务,并使其可注入。
...但是提供一些通用帮助工具似乎有点过头了。
【问题讨论】:
-
将getter改成常规方法
getKeyDown(v)能解决问题吗? -
@user776686 只是部分......模板必须调用它,所以每个组件都需要添加该常规方法,然后调用类上的静态方法,传递它传递的值从模板。我希望避免这种双跳。
-
您可以创建自己的指令来包装/替换
keyDown -
您将通过将 Helper 类的 keyDown 方法更改为非静态成员来避免双跳。然后在模板中你只需调用 helper.keyDown()
标签: angular