Установить обратный вызов нативного веб-компонента из Angular - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть собственный веб-компонент с функцией обратного вызова 'myCallback'.

<script>
    class MyComponent extends HTMLElement {
        constructor() {
            super();
            this.myCallback = this.getAttribute("my-callback");
        }

        connectedCallback() {
            this.innerHTML = "MyComponent";

            const me = this;
            setTimeout(function () {
                const cb = me.myCallback;
                if (typeof cb === "string") {
                    new Function(cb).call(window);
                } else if (typeof cb === "function") {
                    cb.call(window);
                } else {
                    console.log("not a function: " + cb);
                }
            }, 1000);
        }

    }

    customElements.define("my-component", MyComponent);
</script>

Я хочу использовать этот веб-компонент в Angular и назначить ему обратный вызов, но, похоже, он не работает.Это то, что я пробовал до сих пор:

<my-component my-callback="angularCallback()"></my-component>
<my-component my-callback="{{angularCallback}}"></my-component>
<my-component [my-callback]="angularCallback"></my-component>
<my-component [my-callback]="angularCallback()"></my-component>
<my-component (my-callback)="angularCallback()"></my-component>

В первой строке выше выдается ошибка «angularCallback не является функцией», потому что она не определена в окне, но в Angular.Другие строки никогда не вызываются и не выдают никакой ошибки.

В качестве простого теста я попробовал следующее, и он отлично работает:

<my-component my-callback="console.log('test-callback');"></my-component>

Есть ли способ назначить обратный вызов вУгловой через шаблон?

Обновление с решением

Ошибка, которую я сделал, заключалась в том, что я попытался [my-callback] вместо [myCallback]

ТакРешение заключается в следующем:

<my-component [myCallback]="angularCallback"></my-component>

1 Ответ

0 голосов
/ 07 декабря 2018

Атрибуты передаются пользовательскому элементу в виде строки.При передаче функции будет проще передать ее как свойство пользовательского элемента.

Вы можете передать свойство, используя синтаксис [] в Angular.

<my-component [mycallback]="callbackMethod"></my-component>

CallbackMethod - это простая функция в коде ts.

callbackMethod = () => console.log('callback method called');

Затем в пользовательском веб-компоненте вы можете напрямую получить доступ к значению свойства.

setTimeout(function () {
    // directly access the callback property on the component
    const cb = this.mycallback;

    if (typeof cb === "string") {
        new Function(cb).call(window);
    } else if (typeof cb === "function") {
        cb.call(window);
    } else {
        console.log("not a function: " + cb);
    }
}, 1000);

Я создал пример StackBlitz , чтобы проиллюстрировать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...