Компоненты Q.Palette
Q.Web-Component

Q.Web-Component

Q.Web-Component позволяет встраивать приложения в виде веб-компонентов в свой проект. Вы можете отображать их, например, в модальном окне или просто на странице и взаимодействовать с ними как с обычными Angular-компонентами: с помощью @Input(), @Output() или сервиса.

Термины и определения

Главный модуль проекта обычно, AppModule, находящийся в src/app.module.tsРодительский модульМодуль, в компонент которого встраивается веб-компонентВеб-компонентСовместимое с Q.Palette приложение, которое будет встроено на страницу

Создание веб-компонента

Откроем главный модуль вашего проекта и установим конфигурацию для загрузки веб-компонентов:

import { QWebComponentModule } from '@diasoft/qpalette-visual';
...
@NgModule({
  imports:[
    QWebComponentModule.forRoot({
      bundleUrl: '/api/$service/$component/main.js'
    })
  ]
})
export class AppModule

Чтобы просто скопировать команды ниже, введите название создаваемого веб-компонента:

Перейдите в корневую директорию вашего основного приложения (там, где angular.json) и выполните команду

undefined

В случае успешного завершения операции, в директории вашего проекта появится директория projects, внутри которой будет директория с названием вашего нового веб-компонента

Теперь выполним команду преобразования приложения к Q.Palette-совместимому. Для этого выполним команду:

undefined

Встраивание веб-компонента

Импортируйте модуль QWebComponentModule в тот модуль, где необходимо встроить веб-компонент

import { QWebComponentModule } from '@diasoft/qpalette-visual';
...
@NgModule({
  imports:[
    QWebComponentModule
  ]
})

Встройте компонент:

endpoint: QEndpoint = { service: 'qpalettedocui', component: 'my-awesome-web-component', route: '', caption: '', };

Возможности для взаимодействия

Передача параметров при загрузке веб-компонента

Интерфейс QEndpoint предполагает наличие параметров веб-компонента. Они могут быть любыми и будут переданы при загрузке веб-компонента. Для передачи этих параметров используйте полеproperties:

const endpoint: QEndpoint = {
  service: 'qpalettedocui',
  component: 'my-awesome-web-component',
  caption: '',
  properties: {
    hello: 'world'
  }
};

Для получения этих параметров внутри веб-компонента, используйте геттерQWebComponentModule.endpoint:

import { QWebComponentModule } from '@diasoft/qpalette-visual';
 
@Injectable()
export class SomeService {
 
  getPbcProperties (): { [k:string]: any } | undefined {
    return QWebComponentModule.endpoint?.properties;
  }
 
}

Передача событий

Передача событий с помощью свойства data

Пример ниже описывает возможность передачи событий во встраиваемый веб-компонент с помощью свойства data:

import { QEndpoint, QEventsContract } from '@diasoft/qpalette-visual'; data: QEventsContract<any> = { name:
'my-custom-event', payload: { some: 'data', } };
Передача с помощью сервиса QEventsService

Передача с помощью QEventsService осуществляется следующим способом:

import { QEndpoint, QEventsContract, QEventsService } from '@diasoft/qpalette-visual'; constructor(private readonly
qEventsService: QEventsService) {} sendData(): void { this.qEventsService.customEvent({ name: 'my-custom-event',
payload: { some: 'data', } }); }

Получение событий

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

Получение событий с помощью свойства events

Код ниже демонстрирует возможность получения событий с помощью свойства events:##### Получение событий с помощью сервиса QEventsService

Пример ниже демонстрирует возможность получения событий с помощью сервиса QEventsService:

Возможные ошибки

  • Ошибок нет, но веб-компонент не отображается.

    Веб-компонент не приведён к формату Q.Palette. Преобразуйте его с помощью инструкции выше.

  • NullInjectorError: R3InjectorError[QWebComponentService...

    В AppModule родительского приложения не указана конфигурация bundleUrl QWebComponentModule.forRoot(bundleUrl: '/api/$service/$component/main.js' ),

  • If 'q-web-component' is an Angular component....

    В модуле, куда встраивается веб-компонент, не импортирован QWebComponentModule.