Вывод угловых элементов не работает в IE11 - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь заставить Angular Elements работать в IE11. Мой пользовательский элемент (простая кнопка) уже отображается, и привязка ввода работает, как и ожидалось, но привязка вывода не выполняется.

Нажатие на кнопку пользовательского элемента в IE 11 приводит к ошибке:

Объект не поддерживает это действие

Что я сделал до сих пор:

  1. Удалите polyfill для пользовательских элементов, которые были добавлены с ng add @angular/elements (с IE не работал должным образом)
  2. Обновить все пакеты Angular до 7.2.1

  3. Добавьте следующие полифиллы к polyfills.ts:

import 'core-js/shim'
import '@webcomponents/shadydom/shadydom.min.js';
import '@webcomponents/custom-elements/src/native-shim';
import '@webcomponents/custom-elements/custom-elements.min';
  1. Загрузите модуль вручную

  2. ng build --output-hashing=none и упаковать все сгенерированные файлы в btn-element.js, который подается с http-server для локального тестирования (см. index.html ниже).

Мне не хватает определенного полифилла или я что-то не так делаю? Или это просто пока невозможно?

app.module.ts:

@NgModule({
  declarations: [ ButtonComponent ],
  imports: [ BrowserModule ],
  entryComponents: [ ButtonComponent ]
})
export class AppModule {
  constructor(private injector: Injector) {
    const customBtn = createCustomElement(ButtonComponent, { injector });
    customElements.define('app-btn', customBtn);
  }
  ngDoBootstrap() { }
}

button.component.ts:

@Component({
  template: `<button (click)="handleClick()">{{ label }}</button>`,
  encapsulation: ViewEncapsulation.ShadowDom
})
export class ButtonComponent {
  @Input() label;
  @Output() myaction = new EventEmitter<number>();
  private clicksCt: number = 0;

  constructor() { }

  handleClick() {
    this.clicksCt++;
    this.myaction.emit(this.clicksCt);
  }
}

index.html

<html lang="en">
<head>  
  [...]
  <script type="text/javascript" src="btn-element.js"></script>
</head>
<body>
<app-btn label="Button Text"></app-btn>

<script>
    var button = document.querySelector('app-btn');
    button.addEventListener('myaction', function (event) {
         console.log('action emitted: ' + event.detail);          <!-- not working! -->
     });
     setTimeout(function () {
         button.label = 'Async value change happened...'   <!-- working! -->
     }, 2000);
    }
</script>
</body>
</html>

Я тоже безуспешно пытался <app-btn label="Button Text" (myaction)="test($event)"></app-btn>.

Редактировать: Минимальный пример

Кажется, это не работает в IE 11. Чтобы воспроизвести мой результат и увидеть то же самое, как если бы StackBitz запускался в Chrome, выполните следующие действия:

  1. Копирование на локальный компьютер
  2. пробег npm install
  3. запустить npm run build && npm run package:win (для Windows)
  4. служить index.html и сгенерированным btn-element.js с http-server

1 Ответ

0 голосов
/ 23 января 2019

Из официального документа мы могли видеть, что:

Недавно разработанная функция веб-платформы пользовательских элементов в настоящее время поддерживается во многих браузерах. Поддержка ожидается или планируется в других браузерах.

enter image description here

Я также пытаюсь протестировать официальный документ, содержащий демонстрационную версию, она хорошо работает в браузере Chrome, не работает в браузере IE / Edge.

В браузере IE будет отображаться синтаксическая ошибка, например:

enter image description here

Итак, как говорится в официальном документе, они работают над реализацией пользовательского элемента для поддержки браузера IE / Edge.

...