0

我正在开发一个以OnScreenKeyboardCustomAttributeaurelia 命名的自定义属性。工作完成后,我试图使用它一个包含输入的自定义元素,我希望这个元素在那个输入上工作。默认情况下,我在属性类中获取元素,并期望它是输入或文本字段。

但是在该自定义属性上,输入元素位于其他一些元素中。所以我认为下一步是进入元素并实现内部输入。这是可能的,但是当自定义属性具有无容器注释时,我在属性类中没有收到任何元素,而是收到<!--anchor-->. 那么如何才能达到内在元素呢?

自定义元素 - 视图模型

import {
  containerless,
} from 'aurelia-framework';

@containerless()
export class CInputCustomAttribute {
}

自定义元素 - 视图

<template>
  <div class.bind="paClass ? paClass : 'row margin_bottom'">
    <div class.bind="labelClass ? labelClass : 'column_large_3 column_small_4'">
      <label for="${id}" class="label_inline" class.bind="errors.length ? 'text_red' : '' "><span class="required_star"
          if.bind="star">*</span>${label}</label>
    </div>

    <div class.bind="inputClass ? inputClass : 'column_large_9 column_small_8'">
      <input id="${id}" placeholder="${placeholder}" class="input toggle_input" class.bind="errors.length ? 'validate-error' : '' "
        value.bind="value" type="${type}" maxlength="${max ? max : 5000}" click.trigger="typeof runFunction=='function' ? runFunction():''">
      <span class="message_red">
        <template repeat.for="error of errors">
          ${error.error.message}<br>
        </template>
      </span>
    </div>
    <slot></slot>
  </div>
</template>

自定义属性 - viewmodel

@inject(Element, BindingEngine)
export class PaOnScreenKeyboardCustomAttribute {

constructor(element, bindingEngine) {
    this.element = element;
    console.log(this.element);
  }

用法

<c-input type="text" id="username" pa-on-screen-keyboard max="11">

console: <!--anchor-->
4

1 回答 1

2

如果您使用containerless则没有元素可以传递给您的自定义属性。这就是使用的本质containerless。自定义元素在运行时从标记中删除,但您的自定义属性必须附加到某处,因此框架将其放在“锚”注释元素上。因此,这就是它传递给您的属性的内容。

我的建议,这始终containerless是我的建议,除非绝对必要,否则不要使用。不要使用containerlessb/c 它“让你的标记在运行时看起来更好”或者因为“那里的自定义元素破坏了我们的 CSS”。在 Aurelia 公开发布之前,我一直在构建应用程序,除了包装无法修改 CSS 的第三方组件之外,我还没有需要使用containerless. 我什至有一条规则在我的 TSLint 规则中不使用它。

像这样的情况正是我避免使用containerless. 它会导致不稳定的问题。自定义元素通常应该就是那个......元素。无容器元素并不是真正的元素。

于 2018-12-26T21:08:20.970 回答