Schritt 14: Benutzerdefinierte Stile verwenden, wenn die Komponente in einem Inlineframe gerendert wird

In einem Inlineframe gerenderte Komponenten haben keinen direkten Zugriff auf die Datei design.css. Stattdessen wird die URL für die Datei design.css in der Komponente in einem zusätzlichen Schritt abgerufen und der Seite hinzugefügt. Dann müssen Sie die Komponente aktualisieren, um den vom Benutzer ausgewählten Stil widerzuspiegeln.

Um die Datei design.css in die Komponente aufzunehmen und dort zu verwenden, müssen Sie Änderungen in der Datei render.html vornehmen:
  1. Suchen Sie die URL zur Datei design.css, und nehmen Sie sie auf.

  2. Rufen Sie den Wert der ausgewählten Stilklasse bei jeder Änderung ab.

  3. Aktualisieren Sie die Vorlage, um die ausgewählte styleClass widerzuspiegeln.

  4. Spiegeln Sie Änderungen an der ausgewählten Stilklasse in der Komponente wider.

  5. Stellen Sie sicher, dass die Größe des Inlineframes bei Stiländerungen geändert wird.

Ausführliche Anweisungen zum Bearbeiten der Datei render.html:

  1. Suchen Sie die URL zur Datei design.css, und nehmen Sie sie auf.

    Fügen Sie die Datei design.css dynamisch zum <head>-Abschnitt der Seite hinzu. Nachdem der Inlineframe geladen wurde, legen Sie seine Höhe fest, da diese möglicherweise durch Anwenden der Stile geändert wurde.

    Fügen Sie den folgenden Code im viewModel-Objekt hinzu:

    // 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);
        }
    });
  2. Rufen Sie den Wert der ausgewählten Stilklasse bei jeder Änderung ab.

    Erstellen Sie ein Observable, das Änderungen am Wert der styleClass-Eigenschaft verfolgt:

    self.selectedStyleClass = ko.observable();

    Beachten Sie, dass das Rendering erst nach Abruf der Stilklasse möglich ist. Ändern Sie diesen Code:

    self.customSettingsDataInitialized = ko.observable(false);
    self.initialized = ko.computed(function () {
        return self.customSettingsDataInitialized();
    }, self);

    Verwenden Sie stattdessen diesen Code:

    self.customSettingsDataInitialized = ko.observable(false);
    self.styleClassInitialized = ko.observable(false);
    self.initialized = ko.computed(function () {
        return self.customSettingsDataInitialized() && self.styleClassInitialized();
    }, self);

    Rufen Sie den anfänglichen Wert für die ausgewählte Stilklasse ab, indem Sie Folgendes hinzufügen:

    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);
  3. Aktualisieren Sie die Vorlage, um die styleClass widerzuspiegeln. Ändern Sie diesen Code:

    <p data-bind="attr: {id: 'titleId'}, text: titleText"></p>

    Verwenden Sie stattdessen diesen Code:

    <p data-bind="attr: {id: 'titleId'}, text: titleText, css: selectedStyleClass"></p>
  4. Spiegeln Sie Änderungen an der ausgewählten Stilklasse in der Komponente wider. Ändern Sie diesen Code:

    if (settings.property === 'customSettingsData') {
        self.updateCustomSettingsData(settings.value);
    }

    Verwenden Sie stattdessen diesen Code:

    if (settings.property === 'customSettingsData') {
        self.updateCustomSettingsData(settings.value);
    }
    if (settings.property === 'styleClass') {
        self.updateStyleClass(settings.value);
    }
  5. Stellen Sie sicher, dass die Größe des Inlineframes bei Stiländerungen geändert wird. Ändern Sie diesen Code:

    // 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();

    Verwenden Sie stattdessen diesen Code:

    // 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();  
  6. Speichern Sie die Dateien, und synchronisieren Sie sie mit dem Oracle Content Management-Instanzserver.

Ergebnisse für Schritt 14 prüfen

  1. Aktualisieren Sie die Seite in der Site, damit Sitebuilder Änderungen an der Komponente abrufen kann.

  2. Öffnen Sie die Seite im Bearbeitungsmodus.

  3. Ziehen Sie die Komponente per Drag-and-Drop auf die Seite.

  4. Öffnen Sie den Einstellungsbereich für die Komponente.

  5. Gehen Sie zur Registerkarte "Stil".

  6. Wechseln Sie zwischen den in der Datei design.json definierten Stilen Gothic und Plain.

    Sie werden sehen, dass sich der Schriftgrad in der Komponente beim Wechsel der angewendeten CSS-Klasse für jede Auswahl ändert.

Weiter mit Schritt 15: Integration mit dem Undo- und Redo-Verhalten der Seite.