angular [Bug]:命名空间自定义事件

w41d8nur  于 5个月前  发布在  Angular
关注(0)|答案(8)|浏览(72)

🐞 bug报告

受影响的软件包

platform-browser

是否为回归?

否。

描述

使用语法 namespace:event 命名空间自定义事件将失败。例如,绑定到 MDCTabBar:activated 事件将失败(来源)。

<mwc-tab-bar (MDCTabBar:activated)="onTabActivated($event)"></mwc-tab-bar>

问题是Angular会认为你在监听一个全局 activated 事件目标上的 MDCTabBar 事件(来源)。

可能的解决方案

如果Angular不知道事件目标,那么假设它是事件名称的一部分,或者添加语法告诉Angular直接监听事件名称。我想在另一个问题中看到了 ^ 的语法。
例如:

<!-- hey Angular, don't mess with the event name -->
<mwc-tab-bar (^MDCTabBar:activated)="onTabActivated($event)"></mwc-tab-bar>

🔬 最小复现

不需要。

🔥 异常或错误

Unsupported event target null for event activated

🌍 你的环境

Angular版本:

platform-browser: 7.0.3

还有其他相关信息吗?

wnavrhmk

wnavrhmk1#

这是解析的地方:packages/compiler/src/template_parserbinding_parser.ts#L335

编辑:类似这样的代码可以工作:

let target: string | null = null;
let eventName: string;

if (name[0] === '^') {
  eventName = name.slice(1)
else {
  ([target, eventName]) = splitAtColon(name, [null !, name]);
}
du7egjpx

du7egjpx2#

解:如果有人将来降落在这里,我想到了这个丑陋的工作方法。

$x_{1}a_{0}b_{1}x$

$x_{1}a_{1}b_{1}x$

hgqdbh6s

hgqdbh6s3#

由于 MDCTabBar:activated 是一个完全有效的(如果令人惊讶的话!)DOM事件名称,我认为我们不应该有特殊的语法(如 (^MDCTabBar:activated) - 我们应该检查一个已知的集合( document,window,etc )并避免对其进行操作,而是将其传递下去...

hmae6n7t

hmae6n7t4#

在这种情况下,document:activatedwindow:activated也完全是有效的DOM事件名称,为什么不允许它们?

nfs0ujit

nfs0ujit5#

希望为这个PR(以及测试)

oknrviil

oknrviil6#

重新确认已经说过的内容 - 一个名为 : 的事件(例如 MDCTabBar:activated)是一个 valid event name,而 some implementations 使用它!
这里的问题是,Angular 使用 : 来表示要添加事件的目标。在这一点上改变 : 的意义将是一个巨大的破坏性更改。不确定如何解决这个问题,但从用户的Angular 来看,这显然是一个 bug。

osh3o9ms

osh3o9ms7#

有任何更新吗?我们在https://shop.battle.net/上广泛使用了Lit web组件,这些组件会发出包含:(例如,blz-video:state-change)的事件。令人沮丧的是,我们不得不手动添加监听器,而不是利用Angular的绑定语法。

zzwlnbp8

zzwlnbp88#

我找到了一个解决方法!在查看代码后,我注意到_splitAt()只检查character的第一个示例(在这个例子中是:)。所以我们只需要在事件前加上:来欺骗解析器。
使用OP中的例子,解决方法看起来像这样:

<mwc-tab-bar (:MDCTabBar:activated)="onTabActivated($event)"></mwc-tab-bar>

相关问题