У компонентов с рендерингом во встроенной рамке нет прямого доступа к файлу design.css. Вместо этого есть дополнительный этап получения URL-адреса design.css в компоненте и добавления его на страницу. Затем необходимо обновить компонент, чтобы отразить выбранный пользователем стиль.
design.css в компоненте, необходимо внести изменения в файл render.html.
Найдите и включите URL-адрес в файл design.css.
Получите значение выбранного класса стилей при любом его изменении.
Обновите шаблон, чтобы он отражал выбранный класс styleClass.
Отразите изменения выбранного класса стилей в компоненте.
Убедитесь, что при изменении стиля изменяется размер встроенной рамки.
Ниже приведены подробные инструкции по редактированию файла render.html.
Найдите и включите URL-адрес в файл design.css.
Настройте динамическое добавление файла design.css в раздел <head> страницы. После его загрузки задайте высоту встроенной рамки, так как она могла быть изменена при применении стилей.
Добавьте в объект viewModel следующий код:
// Dynamically add any theme design URL to the <head> of the page
self.loadStyleSheet = function (url) {
    var $style,
        styleSheetDeferred = new $.Deferred(),
        attempts = 100,
        numAttempts = 0,
        interval = 50,
        pollFunction = function () {
            // try to locate the style sheet
            for (var i = 0; i < document.styleSheets.length; i++) {
                try {
                    // locate the @import sheet that has an href based on our expected URL
                    var sheet = document.styleSheets[i],
                        rules = sheet && sheet.cssRules,
                        rule = rules && rules[0];
                    // check whether style sheet has been loaded
                    if (rule && (rule.href === url)) {
                        styleSheetDeferred.resolve();
                        return;
                    }
                } catch (e) {}
            }
            if (numAttempts < attempts) {
                numAttempts++;
                setTimeout(pollFunction, interval);
            } else {
                // didn't find style sheet so complete anyway
                styleSheetDeferred.resolve();
            }
        };
 
    // add the themeDesign stylesheet to <head>
    // use @import to avoid cross domain security issues when determining when the stylesheet is loaded
    $style = $('<style type="text/css">@import url("' + url + '")</style>');
    $style.appendTo('head');
 
    // kickoff the polling
    pollFunction();
 
    // return the promise
    return styleSheetDeferred.promise();
};
 
// update with the design.css from the Sites Page
SitesSDK.getSiteProperty('themeDesign', function (data) {
    if (data && data.themeDesign && typeof data.themeDesign === 'string') {
        // load the style sheet and then set the height
        self.loadStyleSheet(data.themeDesign).done(self.setHeight);
    }
});Получите значение выбранного класса стилей при любом его изменении.
Создайте наблюдаемый элемент для отслеживания изменений значения свойства styleClass.
self.selectedStyleClass = ko.observable();
Обратите внимание, что рендеринг невозможен, пока нет класса стилей. Измените этот код:
self.customSettingsDataInitialized = ko.observable(false);
self.initialized = ko.computed(function () {
    return self.customSettingsDataInitialized();
}, self);
Вместо него используйте этот код:
self.customSettingsDataInitialized = ko.observable(false);
self.styleClassInitialized = ko.observable(false);
self.initialized = ko.computed(function () {
    return self.customSettingsDataInitialized() && self.styleClassInitialized();
}, self);
Получите начальное значение для выбранного класса стилей, добавив следующее:
self.updateStyleClass = function (styleClass) {
    self.selectedStyleClass((typeof styleClass === 'string') ? styleClass : 'hello-world-default-style'); // note that this 'hello-world' prefix is based on the app name
    self.styleClassInitialized(true);
};
SitesSDK.getProperty('styleClass', self.updateStyleClass);Обновите шаблон, чтобы он отражал styleClass. Измените этот код:
<p data-bind="attr: {id: 'titleId'}, text: titleText"></p>
Вместо него используйте этот код:
<p data-bind="attr: {id: 'titleId'}, text: titleText, css: selectedStyleClass"></p>Отразите изменения выбранного класса стилей в компоненте. Измените этот код:
if (settings.property === 'customSettingsData') {
    self.updateCustomSettingsData(settings.value);
}
Вместо него используйте этот код:
if (settings.property === 'customSettingsData') {
    self.updateCustomSettingsData(settings.value);
}
if (settings.property === 'styleClass') {
    self.updateStyleClass(settings.value);
}Убедитесь, что при изменении стиля изменяется размер встроенной рамки. Измените этот код:
// 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();
Вместо него используйте этот код:
// 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(),
      selectedStyleClass = viewModel.selectedStyleClass();  Сохраните и синхронизируйте файлы Oracle Content Management на сервере экземпляров.
Проверка результатов для шага 14
Обновите страницу на своем сайте, чтобы приложение Site Builder могло отслеживать изменения в компоненте.
Переключите страницу в режим редактирования.
Перетащите свой компонент на страницу.
Откройте панель "Настройки" для своего компонента.
Перейдите на вкладку "Стиль".
Переключитесь между стилями Готический и Обычный, определенными в файле design.json.
Вы заметите, что размер шрифта в компоненте изменяется в соответствии с изменениями, которые происходят между примененными классами CSS для каждого выбора.
Теперь выполните Шаг 15. Интеграция с процессом выполнения на странице операций "Отмена" и "Повтор".