Полимерные элементы внутри углового 2 компонента

У меня есть набор пользовательских полимерных элементов, которые я хотел бы использовать в приложении angular 2.

Похоже, есть проблема с тегом содержимого полимерного элемента. Содержимое элемента отображается в неправильном месте внутри полимерного элемента, если элемент расположен внутри компонента angular 2.

Пример:

Шаблон моего полимерного элемента "my-button" выглядит так:

<template>

  <button>
    <content></content>
  </button>

</template>

Использовать внешний угол

Когда я использую этот элемент вне моего компонента angular 2, я получаю ожидаемый результат:

Использовать:

<my-button>Foo</my-button>

Результат:

<my-button>
  <button>
    Foo
  </button>
<my-button>

Использовать в компоненте angular 2

При использовании в компоненте angular 2 содержимое всегда отображается в конце шаблона элементов. Точно так же, как тег содержимого не существовал.

Использовать:

<my-button>Foo</my-button>

Результат:

<my-button>
  <button>

  </button>
  "Foo"
<my-button>

Вопрос

Проблема может заключаться в том, что и полимер, и угловой 2 используют тег содержимого для преобразования. Так что, возможно, все становится немного грязным при использовании обоих вместе.

Я хотел бы использовать все свои полимерные элементы внутри angular 2. Поэтому любые идеи о том, как это исправить, будут очень признательны.


person Simon    schedule 13.01.2016    source источник
comment
Вы пытались прослушать событие WebComponentsReady перед применением каких-либо угловых скриптов?   -  person Neil John Ramal    schedule 14.01.2016


Ответы (2)


Есть несколько открытых вопросов об Angular2 в сочетании с Polymer. Например, Angular не использует Polymer.dom(el)... для управления дочерними элементами Polymer. Вероятно, это то, что ломает ваши компоненты. Обходной путь — включить полную тень DOM и полифиллы. См. https://www.polymer-project.org/1.0/docs/devguide/settings.html

Проблема, решение которой я еще не нашел, заключается в передаче <template>s (как требуется, например, для <iron-list>. Angular обрабатывает шаблоны самостоятельно и не передает их элементу Polymer.

Есть директива ngNonBindable. Я еще не пробовал это на <template ngNonBindable>, но это может сработать. Я пытался, кажется, только игнорировать привязки [prop]="field"/prop="{{field}}.

Другая проблема связана с <style is="custom-style">. Их можно добавить только в элемент <head> или в элементы Polymer, но не в компоненты Angular.

См. также Двусторонняя привязка в Angular 2 с NgModel и изменяющим связанным свойством?

person Günter Zöchbauer    schedule 14.01.2016
comment
Я пробовал полимерные компоненты, возьмем, например, бумажный флажок, теперь, если я привязываю проверенное свойство [checked]="myselection", оно просто устанавливает логическое значение, но не получает, если оно проверено? Есть ли объяснение, почему эти элементы ведут себя таким образом? PS я включил dom = 'shady' - person Pratik Kelwalkar; 09.05.2016
comment
@PratikKelwalkar Полимер с теневым DOM плохо работает с Angular2. Вместо этого я предлагаю включить теневой DOM. Не уверен, что вы имеете в виду, но не получите, если проверено. Вам понадобится [checked]="myselection" (checkedChanged)="myselection = $event" (сам не проверял) - person Günter Zöchbauer; 09.05.2016
comment
Хорошо, спасибо, zoechi, попробуй, я хотел узнать, установлен ли флажок с помощью атрибута [checked], но я не смог получить логическое значение, вместо этого смог только установить значение. - person Pratik Kelwalkar; 09.05.2016
comment
[checked]=... в Angular2 привязывается только от модели к представлению. (xxx) является привязкой представления к модели. Это работает для свойств элементов Polymer, которые уведомляют. В Angular есть [(xxx)]="..." для двусторонней привязки, но для этого требуется некоторое соглашение об именах, которое нарушает Polymer, поскольку он запускает события уведомления, такие как checked-changed, в то время как Angular требует checkedChange для работы двусторонней привязки. stackoverflow.com/questions/35867952/ для альтернативного способа (не пробовал с бумажным флажком) - person Günter Zöchbauer; 09.05.2016
comment
[checked]="myselection" (checkedChanged)="myselection = $event" не работает, есть предположения, как это может работать. Я могу получить проверенное значение через @ViewChild(), но это не совсем то, что я хочу. Я хочу использовать это в ngForm, где должна работать привязка ngModel... любые предложения, как это сделать. - person Pratik Kelwalkar; 09.05.2016
comment
Пожалуйста, попробуйте (checked-changed) вместо (checkedChanged) - person Günter Zöchbauer; 09.05.2016
comment
Это меня удивляет, но в документации полимера говорится, что он уведомляет, тогда не должно ли [] значение привязки измениться? Возьмем другой пример: elements.polymer-project.org/elements/ здесь атрибут signedIn не может быть привязан, то есть я не могу получить данные из представления в модель? - person Pratik Kelwalkar; 09.05.2016
comment
Angulars [...] не выполняет двустороннюю привязку, а [(...)] только при соблюдении соглашения об именах. Для компонента, на который вы ссылаетесь, вы можете использовать (google-signin-success)="loggedIn = $event.detail.value" элементы .polymer-project.org/elements/ - person Günter Zöchbauer; 09.05.2016
comment
Это еще один, который я испортил выше. [checked]="myselection" (checkedChanged)="myselection = $event.detail.value", потому что в Polymer событие находится в detail.value, а в Angular само событие является значением. Возможно, вам нужно исследовать каждое событие, потому что не каждое событие Polymer предоставляет value или может также предоставлять разные свойства. - person Günter Zöchbauer; 09.05.2016

Проверьте https://www.npmjs.com/package/@vaadin/angular2-polymer, что должно решить большинство проблем при интеграции элементов Polymer в Angular 2.

Руководство пользователя: https://github.com/vaadin/vaadin-core-elements/blob/master/docs/angular2.adoc

Учебное пособие (черновик): https://github.com/vaadin/angular2-polymer/blob/d4581e8fd82841eea84ef40e16e262a12ee4b082/docs/tutorial.adoc

Лучшая поддержка теневого DOM ожидает объединения из отдельной ветки (должно быть объединено и выпущено в течение двух недель): https://github.com/vaadin/angular2-polymer/tree/feature/polymer-dom-адаптер

Было бы здорово, если бы вы могли попробовать и посмотреть, работает ли это для вас!

Со временем документация будет опубликована по адресу https://vaadin.com/docs/.

person Jouni    schedule 24.05.2016