Ссылка на слот внутри ViewModel компонента Aurelia

Допустим, у вас есть следующий компонент:

export class Message {
    messageTxt: string = "";

    attached() {
       // reference the slot HTMLElement here somehow
    }
}

со следующим шаблоном:

<template>
   <div>
      <slot name="trigger">
      </slot>

      <div>${messageTxt}</div>
   </div>
</template>

Как следует из комментария в коде, мне интересно, как получить доступ к <slot> элемент в ViewModel. Я пытался добавить ref приписывают это, но это undefined,

Я также попытался добавить к нему родителя, поставив ref на родителя и получая слот HTMLElement путем доступа к непосредственному ребенку родителя. Это сработало, но мне интересно, есть ли лучшее решение.

Просто чтобы прояснить, мне нужен элемент, который собирается заменить <slot>,

1 ответ

Решение

Если вы знаете имя тега, который будет в <slot>, вы можете использовать @child распознаватель. Например:

ViewModel сообщения

import {child} from 'aurelia-framework';

export class Element1 {
  @child('p') myP;

  attached() {
    console.log(this.myP);
  }
}

Сообщение Посмотреть

<template>
   <slot></slot>
</template>

использование

<element1>
   <p>test 1 2 3</p>
</element1>

использование @children для коллекции элементов:

ViewModel сообщения

import {children} from 'aurelia-framework';

export class Element1 {
  @children('ps') myPs = [];

  attached() {
    console.log(this.myPs);
  }
}

использование

<element1>
   <p>test 1 2 3</p>
   <p>test 1 2 3</p>
   <p>test 1 2 3</p>
</element1>

Если вы не знаете имя тега, вы можете вставить элемент и выполнить итерацию по children имущество. Например:

Сообщение Посмотреть

<template>
  <slot name="1"></slot>
  <slot name="2"></slot>
</template>

ViewModel сообщения

import {inject} from 'aurelia-framework';

@inject(Element)
export class Element1 {

  constructor(element) {
    this.element = element;
  }

  attached() {
    //iterate over this.element.children;
  }
}

использование

<template>
  <require from="./element1"></require>

  <element1>
    <p slot="1">sadfasdf</p>
    <p slot="2">asdfsadfasd</p>
  </element1>
</template>
Другие вопросы по тегам