Я стараюсь лучше учиться на тестах 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
, он меняет его на все, что ссылается на него в пределах этой области. 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>
Отказ от ответственности:
Я собираюсь упомянуть только «старый» Asset API в com.day.cq.dam.api
. В com.adobe.granite.asset.api
есть более новый API, который отличается и лишен некоторых функций, поэтому я обычно предпочитаю использовать «старый» API.
Существует несколько способов получения переводов в AEM, и все они имеют свои преимущества и недостатки.
Прежде чем я начну объяснять несколько способов получения переводов, необходимо сделать два правила, чтобы облегчить себе жизнь:
Вы писали:
Необходимо увеличить разрешение или получить оригинальное изображение.
blockquote>Если вы просто хотите получить оригинальное представление, вы можете просто использовать:
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
, и он попытается найти ближайшее наиболее подходящее представление. Это также может быть очень удобно в определенных ситуациях.Ссылки: