Атрибут ref Aurelia в дочернем контейнере - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть компонент parent, где модель представления содержит свойство prop1.По его мнению, пользовательский элемент имеет view-model.ref="prop1".

export class Parent {
  public prop1;
}

<template>
  <custom-element view-model.ref="prop1"></custom-element>
</template>

. Это работает как брелок, и я получаю ссылку на модель представления моего пользовательского элемента в моем parent.

*.1009 * Теперь я добавляю дочерний маршрутизатор к parent с компонентом child.В модель представления child я добавляю свойство prop1.и, по его мнению, пользовательский элемент имеет view-model.ref="prop1".Точно так же, как я делал в parent ...

Как только я перехожу к parent/child, контейнер parent prop1 прекращает ссылаться на пользовательский элемент parent и начинает ссылатьсятот от child.Если я по-разному называю свойства, проблем не возникает.

Есть идеи, почему это происходит?И как я мог избежать такого поведения, не беспокоясь об именах свойств?

РЕДАКТИРОВАТЬ Я случайно получил еще немного информации!Если свойства инициализируются в модели представления, я могу сохранить ссылки в моделях представления.Обратите внимание, что я использую Typescript, поэтому я думаю, что скомпилированный код для неназначенного свойства класса вообще не упоминает это свойство, пока оно не будет назначено.Я до сих пор не совсем понимаю, откуда возникла проблема ...

И я остаюсь с той же проблемой, если использую view-model.ref непосредственно в шаблоне, не сопоставляя его с явным свойством из представлениямодель, как это:

<template>
  <custom-element view-model.ref="custom"></custom-element>
  <custom-element2 opened.call="custom.opened()"></custom-element2>
</template>

1 Ответ

0 голосов
/ 12 сентября 2018

когда вы создаете свойство в классе и ничего ему не назначаете, babel / typcript удалит это свойство, как если бы оно даже не было объявлено .. потому что оно действительно ничего не делает. typcript интересует ваши определения только во время компиляции.

теперь, когда ваша собственность на ребенка передана, у вас есть привязка на ребенке к необъявленной собственности. в этом случае aurelia создает свойство для вас и связывается с ним ..

но в вашем случае aurelia находит это свойство в родительской области (точно так же, как обычные правила области видимости JS), и поэтому не создает "новое свойство" в дочерней области, а скорее связывается с родительским свойством.

именно поэтому, когда вы инициализируете свойство у дочернего элемента (даже с undefined), оно "работает". потому что у вас есть 2 свойства в 2 областях.

и когда вы измените имя, aurelia создаст для вас новое свойство .. и вот еще одно правило - wen aurelia создает свойство для вас - оно создает его в самой низкой доступной области видимости .. в вашем случае - дочерней области. и все снова работает.

Вы можете заметить это поведение с помощью repeate.for, потому что ретранслятор создает невидимую область для каждого цикла repeate. если вы связываете что-либо в повторе со свойством, которое не существует, у вас будет это свойство в каждом дочернем элементе, а не один раз в родительском.

...