Aurelia 自定义元素中触发的自定义渲染器和验证问题

Aurelia 自定义元素中触发的自定义渲染器和验证问题,aurelia,Aurelia,我在用奥雷莉亚-validation@1.0.0-beta.1.0.1 我的设想是: 我有一个表单,它有一个验证控制器和验证规则 表单中有一个无容器的自定义元素,它包装密码输入,并将当前密码作为可绑定属性公开 验证绑定行为用于表单与此自定义元素属性的绑定 custom元素还引发blur事件,以便在包装的密码输入失去焦点时触发验证绑定 验证生命周期正在按预期工作 我遇到的问题是我正在使用的自定义渲染器,它当前假定它接收的元素是实际的DOM输入元素,这样就可以将类应用于输入,并且可以在其旁边注入

我在用奥雷莉亚-validation@1.0.0-beta.1.0.1

我的设想是:

  • 我有一个表单,它有一个验证控制器和验证规则
  • 表单中有一个无容器的自定义元素,它包装密码输入,并将当前密码作为可绑定属性公开
  • 验证绑定行为用于表单与此自定义元素属性的绑定
  • custom元素还引发blur事件,以便在包装的密码输入失去焦点时触发验证绑定
验证生命周期正在按预期工作

我遇到的问题是我正在使用的自定义渲染器,它当前假定它接收的元素是实际的DOM输入元素,这样就可以将类应用于输入,并且可以在其旁边注入同级错误元素,但在这里它接收包装输入的自定义元素,它不能以相同的方式处理,因为它只是DOM中的一个注释节点

aurelia验证中是否有一种策略或API可以解决此类问题?我被难住了,在验证中找不到太多关于使用自定义元素的信息

编辑:

以下是自定义元素模板:

<template>
<div class="input-group -password">
    <div class="input-toggle-wrapper">
        <label for="password" class="-hidden" t="fields_Password"></label>

        <input
            id="password"
            type="${isPasswordVisible ? 'text' : 'password'}"
            value.bind="password"
            t="[placeholder]fields_Password"
            maxlength="20"
            focus.trigger="onInputFocus()"
            blur.trigger="onInputBlur()" />

        <div
            class="toggle ${isPasswordVisible ? '-show' : ''}"
            click.delegate="onToggleClick($event)"
            mousedown.delegate="onToggleMouseDown($event)"></div>
    </div>
</div>
</template>

我将其设置为无容器,因为我不想将
作为外部元素发送到DOM中,因为这打破了当前布局的CSS规则(我不想更改CSS)


但是,如果自定义元素是无容器的,那么我不知道如何使用来自表示DOM中自定义元素的注释节点的DOM导航来访问模板中的第一个div。

不幸的是,Aurelia团队已经发现了这个问题,并且(至少到目前为止)说他们不会解决它

针对该问题,有一个黑客解决方法,如下所示:

if(element.nodeType === 8) {
  element = this.getPreviusElementSibling(element)
}

如果在渲染器的渲染方法中添加该选项,它应该可以工作。同样,hacky,但是它完成了工作,而不是来自AU团队的正式修复。

您能分享您的自定义元素代码吗?
@containerless
的具体原因是什么?也许您必须检查元素是真正的HTMLInputElement还是注释,然后选择正确的策略我添加了模板代码。我们最终创建了一个解决方案,允许自定义元素通过实现自定义接口在父上下文中与验证交互-当验证呈现器检查元素是否附加消息时,它可以查看元素是否为自定义元素,并通过与自定义元素交互作为接口(称为IHasCustomValidation)将验证指令传递给它,因此自定义元素可以返回内部元素,这在实践中非常有效。