Представления активов DAM - получение представления cq5dam.thumbnail.48.48.png, но требуется исходное представление

Я стараюсь лучше учиться на тестах GOOD / BAD. Мне нравится видеть рабочий код, за которым следует нерабочий код, с которым кто-то может столкнуться. Я собрал a jsFiddle , который делает сравнение, и пытается свести различия к простейшим объяснениям, которые я мог бы придумать.

Завершения выполнены правильно:

console.log('CLOSURES DONE RIGHT');

var arr = [];

function createClosure(n) {
    return function () {
        return 'n = ' + n;
    }
}

for (var index = 0; index < 10; index++) {
    arr[index] = createClosure(index);
}

for (var index in arr) {
    console.log(arr[index]());
}
  • В приведенном выше коде createClosure(n) вызывается на каждой итерации цикла. Обратите внимание, что я назвал переменную n, чтобы выделить, что это новая переменная, созданная в новой области функций, и не является той же переменной, что и index, которая привязана к внешней области.
  • Это создает новая область и n привязаны к этой области; это означает, что у нас есть 10 отдельных областей, по одному для каждой итерации.
  • createClosure(n) возвращает функцию, которая возвращает n в пределах этой области.
  • В пределах каждой области n независимо от того, какое значение оно имело, когда createClosure(n) был вызван, поэтому вложенная функция, которая возвращается, всегда будет возвращать значение n, которое оно имело при вызове createClosure(n).

Завершение сделано неправильно :

console.log('CLOSURES DONE WRONG');

function createClosureArray() {
    var badArr = [];

    for (var index = 0; index < 10; index++) {
        badArr[index] = function () {
            return 'n = ' + index;
        };
    }
    return badArr;
}

var badArr = createClosureArray();

for (var index in badArr) {
    console.log(badArr[index]());
}
  • В приведенном выше коде цикл был перемещен внутри функции createClosureArray(), и теперь функция только возвращает завершенный массив, который на первый взгляд кажется более интуитивным.
  • Что может быть не очевидным, так это то, что поскольку createClosureArray() вызывается только после создания только одной области для этой функции вместо одной для каждой итерации цикла.
  • В этой функции переменная с именем index. Цикл запускается и добавляет функции массиву, возвращающему index. Обратите внимание, что index определяется внутри функции createClosureArray, которая только когда-либо вызывается один раз.
  • Поскольку в функции createClosureArray() имеется только одна область, index привязана только к значению в пределах этого объема. Другими словами, каждый раз, когда цикл меняет значение index, он меняет его на все, что ссылается на него в пределах этой области.
  • Все функции, добавленные в массив, возвращают переменную SAME index из родительской области, где она была определена вместо 10 различных из 10 различных областей, таких как первый пример. Конечным результатом является то, что все 10 функций возвращают одну и ту же переменную из той же области.
  • После завершения цикла и index было изменено конечное значение 10, поэтому каждая функция, добавленная в массив, возвращается значение единственной переменной index, которая теперь установлена ​​в 10.

Результат

ЗАКРЫТЬ СДЕЛАНО ПРАВО n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6 n = 7 n = 8 n = 9

ЗАКРЫВАЕТСЯ СОВЕРШЕННО n = 10 n = 10 n = 10 n = 10 n = 10 n = 10 n = 10 n = 10 n = 10 n = 10

blockquote>

0
задан Jens 22 March 2019 в 14:25
поделиться

1 ответ

Отказ от ответственности:

Я собираюсь упомянуть только «старый» Asset API в com.day.cq.dam.api. В com.adobe.granite.asset.api есть более новый API, который отличается и лишен некоторых функций, поэтому я обычно предпочитаю использовать «старый» API.


Существует несколько способов получения переводов в AEM, и все они имеют свои преимущества и недостатки.

Прежде чем я начну объяснять несколько способов получения переводов, необходимо сделать два правила, чтобы облегчить себе жизнь:

  1. Никогда не ожидайте, что существуют эскизы или веб-версии.
  2. Никогда не используйте оригинальную версию, за исключением загрузок.

Вы писали:

Необходимо увеличить разрешение или получить оригинальное изображение.

Если вы просто хотите получить оригинальное представление, вы можете просто использовать:

Rendition rendition = asset.getOriginal();

Но если вы хотите получить миниатюру или веб-версию, вам следует используйте один из RenditionPicker.

Чтобы получить отображение миниатюр, вы можете использовать:

PrefixRenditionPicker picker = new PrefixRenditionPicker(DamConstants.PREFIX_ASSET_THUMBNAIL, true)
Rendition rendition = picker.getRendition(asset);

Это даст вам первое представление миниатюр, которое найдет сборщик. Теоретически вы можете вызвать определенную передачу миниатюр, расширив код следующим образом:

PrefixRenditionPicker picker = new PrefixRenditionPicker(DamConstants.PREFIX_ASSET_THUMBNAIL + ".319", true)
Rendition rendition = picker.getRendition(asset);

Это вернет 319px представление миниатюр с именем cq5dam.thumbnail.319.319.png. Но помните, что нет гарантии, что это исполнение существует. Если нет воспроизведения с этим именем, RenditionPicker сверху просто вернет отображение original (потому что мы использовали true в качестве второго параметра).

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

PrefixRenditionPicker picker = new PrefixRenditionPicker(DamConstants.PREFIX_ASSET_WEB, true)
Rendition rendition = picker.getRendition(asset);

Или использовать выделенную WCMRenditionPicker:

WCMRenditionPicker picker = new WCMRenditionPicker();
Rendition rendition = picker.getRendition(asset);

Но, как и раньше, это вернет первое представление, которое найдено или ноль , если ничего не найдено.

В зависимости от вашего варианта использования вы можете создать свой собственный RenditionPicker, реализовав следующий интерфейс:

com.day.cq.dam.api.RenditionPicker

Существует также другой API, который я хочу упомянуть, это com.day.cq.dam.commons.util.UIHelper. Этот класс содержит несколько интересных методов, таких как:

getBestfitRendition(Asset asset, int width)

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

Ссылки:

  1. Актив Javadoc
  2. Rendition Javadoc
  3. PrefixRenditionPicker Javadoc
  4. WCMRenditionPicker Javadoc
  5. PREFIX_ASSET_THUMBNAIL константа Javadoc
  6. [PREFIX_ASSET_WEB константа Javadoc 1138] 1138] UIHelper Javadoc
0
ответ дан Jens 22 March 2019 в 14:25
поделиться