#angular #cloudinary
#угловая #cloudinary
Вопрос:
У меня проблема с использованием Cloudinary с Angular. Если я добавлю простое изображение, подобное этому:
<cl-image class="img-fluid" [public-id]="brand.image.publicId" dpr="auto" crop="scale">
<cl-placeholder type="pixelate">
</cl-placeholder>
<cl-transformation quality="auto" fetch-format="auto" width="500">
</cl-transformation>
</cl-image>
Это работает нормально.
Если я попытаюсь затем добавить ширину:
<cl-image class="img-fluid" [public-id]="brand.image.publicId" dpr="auto" crop="scale">
<cl-placeholder type="pixelate">
</cl-placeholder>
<cl-transformation width="150" crop="thumb">
</cl-transformation>
<cl-transformation quality="auto" fetch-format="auto" width="500">
</cl-transformation>
</cl-image>
Это тоже работает. Но я хочу, чтобы моя ширина была переменной, а не статической шириной. Поэтому я обновил код до этого:
<cl-image class="img-fluid" [public-id]="brand.image.publicId" dpr="auto" crop="scale" *ngIf="width">
<cl-placeholder type="pixelate">
</cl-placeholder>
<cl-transformation [width]="width" crop="thumb">
</cl-transformation>
<cl-transformation quality="auto" fetch-format="auto" width="500">
</cl-transformation>
</cl-image>
И это не работает. Он отображает изображение, но не изменил его размер, что нехорошо.
Обратите внимание на эту строку:
<cl-transformation [width]="width" crop="thumb">
Похоже, что она игнорируется, также я убедился, что компонент не создается до тех пор, пока ширина не будет установлена с помощью *ngIf="width"
.
Кто-нибудь знает, почему это не работает?
Ответ №1:
В вашем app.component.ts вы можете объявить свои переменные, например:
public imageHeight = "500";
public imageQuality = "50";
А затем на вашем app.component.html , в вашем cl-transformation
элементе вам нужно будет использовать ключевое слово attr.
:
<cl-transformation
attr.height="{{imagesize}}"
crop="scale"
attr.quality="{{imagequality}}"
>
Ответ №2:
У меня нет большого опыта работы с Cloudinary. и не тестировал его myslef. Глядя на код Cloudinary, вы можете попробовать несколько вариантов:
- Используйте
width
входные данные вcl-image
компоненте. У компонента есть определение для него
export class CloudinaryImage
implements AfterViewInit, OnInit, AfterViewInit, AfterContentChecked, OnChanges, OnDestroy {
@Input('public-id') publicId: string;
@Input('client-hints') clientHints?: boolean;
@Input('loading') loading: string;
@Input('width') width?: string;
@Input('height') height?: string;
- Если это не то, что вы ищете, то, глядя на директиву cl-transformation, кажется, что вы можете передавать только собственные атрибуты.
export class CloudinaryTransformationDirective {
constructor(private el: ElementRef) {
}
getAttributes(): NamedNodeMap {
return this.el.nativeElement.attributes;
}
}
Это означает, что для передачи динамических значений в атрибут элемента директивы, возможно, вы можете использовать интерполяцию.
<cl-transformation width="{{ width }}" >
Комментарии:
1. спасибо за это, но я уже пробовал оба из них, и они не работают. Я настрою codepen или аналогичный позже, чтобы показать мою проблему. Если вы попробуете cl-преобразование, вы получите сообщение об ошибке, в котором указано, что для cl-преобразования нет параметра width.
2. Кроме того, если вы посмотрите на входные данные для изображения, оно используется только для заполнителя, а это не то, что я хочу
3. Не уверен, но если вы пытаетесь установить собственный атрибут для элементов, возможно
[attr.width]=""
, вам могут помочь привязки атрибутов или сделать это программно, получив представление элемента и выполнив nativeElement.setAttribute
Ответ №3:
Я не слишком хорошо знаком с Angular, но вы можете попробовать следующее, пока не появится кто-то более знакомый:
<cl-transformation width={{width}} crop="thumb">
Передача жестко запрограммированного целого числа работает, поэтому, если width
оно определено и является целым числом, оно может работать.
Комментарии:
1. Я пробовал это, но все, что я получаю, это ошибка: невозможно привязать к ‘width’, поскольку это не известное свойство ‘cl-transformation’.