Шаг 13. Рендеринг компонента во встроенной рамке

В этом примере показан локальный компонент с рендерингом во встроенной рамке на странице. Также можно выбрать рендеринг компонента во встроенной рамке.

Например, рендеринг компонента во встроенной рамке можно выбрать, если компонент выполняет лишь незначительные обновления страницы, которые требуют повторного создания страницы при любом изменении свойств. Кроме того, рендеринг удаленных компонентов всегда осуществляется во встроенной рамке.

Примеры в этом разделе берутся из файлов, созданных для вас, когда при создании локального компонента вы выбираете вариант Создать компонент с рендерингом в iframe. Однако можно взять этот набор файлов и разместить их на удаленном сервере, чтобы они одинаково применялись к удаленным компонентам.

Сходство между компонентами во встроенной и невстроенной рамках

Панель "Настройки"

Поскольку панель "Настройки" всегда помещается на страницу во встроенной рамке, код панели "Настройки" не зависит от того, использует компонент встроенную рамку или нет. Для обоих сценариев использования создается один и тот же код панели "Настройки".

API-интерфейс Sites SDK

API-интерфейс SDK один и тот же для обоих сценариев использования. Один и тот же код используется для создания триггеров, прослушивания действий, получения и задания значений свойств. Хотя некоторые свойства могут быть неприменимы в обоих случаях (например, невозможно задать свойство "height" для компонента, который не использует встроенную рамку), API-интерфейс остается таким же. Следовательно код можно копировать между компонентами обоих типов, а пример кода, рассматриваемый в данном учебном пособии работает в обоих случаях.

Разница между компонентами во встроенной и невстроенной рамках

Структура файлов и зависимости

Если при создании локального компонента выбрать вариант Создать компонент с рендерингом в iframe, отображаются следующие файлы, созданные для вас:
<component name>
    assets
        css
            app-styles.css
        js
            jquery.mn.js
            knockout.mn.js
            sites.min.js
        render.html
        settings.html
    appinfo.json
    _folder_icon.jpg

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

  • Зависимости JavaScript

    • Вы получаете полную копию этих файлов для работы своего компонента. Эти файлы необходимы образцу компонента во встроенной рамке для работы. Вы можете добавлять и удалять содержимое этого каталога в соответствии со своими требованиями.

    • Поскольку все содержимое каталога assets вашего компонента передается общедоступному сайт при публикации компонента, все содержимое каталога js будет доступно как в Site Builder, так и во время выполнения.

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

  • render.html

    • В отличие от файла render.js для стандартных компонентов это полный HTML-документ, представляющий собой AMD-модуль.

Управление высотой компонента

Одна из проблем при использовании встроенной рамки — управление ее высотой. В случае ошибки на странице отображаются полосы прокрутки для компонента, которые могут быть вам и не нужны.

Для управления высотой встроенной рамки компонент должен сообщить странице нужную высоту встроенной рамки. В случае удаленных компонентов могут возникнуть междоменные проблемы, поэтому с помощью обмена сообщениями Sites SDK необходимо запросить страницу задать требуемую высоту встроенной рамки после рендеринга компонента на странице. Для этого используется API-интерфейс SitesSDK.setProperty('height', {value}). (См. Комплекты SDK Oracle Content and Experience.)

Например, создайте функцию setHeight и пользовательский обработчик привязки, чтобы вызывать его после рендеринга компонента на странице.

  • Функция обновления высоты

    // set the height of the iFrame for this App
    self.setHeight = function () {
    // use the default calculation or supply your own height value as a second parameter
    SitesSDK.setProperty('height');
    };
  • Пользовательский обработчик привязки для вызова setHeight вызывается во время рендеринга компонент на странице или при любом изменении свойств:

    ko.bindingHandlers.sampleAppSetAppHeight = {
      update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        // create dependencies on any observables so this handler is called whenever it changes
        var imageWidth = viewModel.imageWidth(),
            imageUrl = viewModel.imageUrl(),
            titleText = viewModel.titleText(),
            userText = viewModel.userText();
    
      // re-size the iFrame in the Sites page now the template has rendered
      // Note: If you still see scrollbars in the iframe after this, it is likely that CSS styling in your app is the issue
      viewModel.setHeight();
     }
    };
  • Обновление шаблона для вызова обработчика привязки:

    <div data-bind="sampleAppSetAppHeight: true"></div>

Регистрация триггеров и действий

Хотя записи регистрации триггера/действия для компонентов не во встроенных рамках находятся в файле appinfo.json, в случае компонентов во встроенных рамках за предоставление этой информации отвечает сам компонент. Для этого используются два API-интерфейса:

SitesSDK.subscribe('GET_ACTIONS', self.getAppActions);
SitesSDK.subscribe('GET_TRIGGERS', self.getAppTriggers);

Вот пример использования этих API-интерфейсов.

    // Register TRIGGERS meta-data
    SampleAppViewModel.prototype.getAppTriggers = function (args) {
      var triggers = [{
        "triggerName": "imageClicked",
        "triggerDescription": "Image clicked",
        "triggerPayload": [{
          "name": "payloadData",
          "displayName": "Trigger Payload Data"
        }]
      }];

      return triggers;
    };

    // Register ACTIONS meta-data
    SampleAppViewModel.prototype.getAppActions = function (args) {
      var actions = [{
        "actionName": "setImageWidth",
        "actionDescription": "Update the image width",
        "actionPayload": [{
          "name": "imageWidth",
          "description": "Image Width in pixels",
          "type": {
            "ojComponent": {
            "component": "ojInputText"
            }
          },
          "value": ""
        }]
      }];

      return actions;
    };

Доступ к стилям темы

Поскольку рендеринг компонента осуществляется во встроенной рамке, у него нет доступа к стилям, доступным в теме. Sites SDK предоставляет API-интерфейс, чтобы извлекать эти стили для применения к элементам внутри встроенной рамки.

Эта тема более подробно рассматривается в разделе Шаг 14. Использование пользовательских стилей во время рендеринга компонента во встроенной рамке.

Смешанный протокол HTTPS и протокол HTTP

Поскольку платформа Oracle Content Management использует протокол HTTPS, все ресурсы, на которые ссылается страница, также должны использовать HTTPS. Ресурсы включают в себя базовый файл .html, который будет визуализироваться во встроенной рамке вместе со всеми файлами, на которые он ссылается.

Это требование к ресурсам относится в основном к удаленным компонентам, однако необходимо знать об этом ограничении. Ресурсы для локальных компонентов, использующих встроенные рамки, предоставляются сервером Oracle Content Management, поэтому эти компоненты уже используют соответствующий протокол.

Теперь выполните Шаг 14. Использование пользовательских стилей во время рендеринга компонента во встроенной рамке.