РЕДАКТИРОВАТЬ 2: Проблема была исправлена удивительной командой CDK!
РЕДАКТИРОВАТЬ: Поскольку это кажется довольно странным поведением, я добавили проблему в официальном репозитории CDK . Тем не менее, не стесняйтесь предлагать любые идеи или методы работы.
В моем *cdkDropList
есть различные типы элементов, которые нуждаются в различных возвышениях плашдолдера при их перетаскивании. Поскольку в массиве есть объекты со свойством type
, я добавил эти типы как классы CSS и попытался добавить их динамически, используя [ngClass]
. Однако эти динамически генерируемые классы ведут себя иначе, чем когда я устанавливаю их как «обычные» CSS классы.
Вот что происходит, когда я устанавливаю классы динамически:
![enter image description here](https://i.stack.imgur.com/uShI0.png)
Заполнитель и элементы в dropList
перекрываются. Вот соответствующий код:
example.component.ts
contentItems: ContentItem[] = [
{ type: 'text', /* more props */ },
{ type: 'text', /* more props */ },
{ type: 'image', /* more props */ }
];
example.component.html
<div *ngFor="let item of contentItems" class="editor-item" cdkDrag>
<div [ngClass]="['dropzone-placeholder', item.type]" *cdkDragPlaceholder>
<p>{{ 'EDITOR.INSERT HERE' | translate }}</p>
</div>
<app-language-tab-editor *ngIf="item.type === 'text'"></app-language-tab-editor>
<app-image-upload *ngIf="item.type === 'image'"></app-image-upload>
</div>
example.component.scss
$dropzone-placeholder-dark: #00973B;
$dropzone-placeholder-light: #00973B0D;
$text-placeholder-height: 135px;
$image-placeholder-height: 375px;
.dropzone-placeholder {
border: 1px dashed $dropzone-placeholder-dark;
color: $dropzone-placeholder-dark;
background: $dropzone-placeholder-light;
&.text {
height: $text-placeholder-height;
}
&.image {
height: $image-placeholder-height;
}
}
Я только сейчас Есть два разных типа, но цель состоит в том, чтобы сделать его легко расширяемым, чтобы добавить больше позже. Я также уже пытался вместо этого использовать class="dropzone-placeholder {{ item.type }}"
и [class]="'dropzone-placeholder ' + item.type"
, но безрезультатно.
После дальнейшего тестирования я также обнаружил, что он обычно не работает с использованием [ngClass]
, даже если мы не используем переменную. Использование [ngClass]="['dropzone-placeholder', 'text']"
также не сработало.
Это ожидаемое поведение:
![enter image description here](https://i.stack.imgur.com/eSJIK.png)
Заполнитель и элементы в dropList
не перекрываются и вместо этого размещаются должным образом друг под другом. Такое поведение в настоящее время может быть достигнуто только путем регулярной установки классов, но на HTML довольно неприятно смотреть, поскольку в будущем код станет беспорядочно избыточным.
example.component.html
<div *ngFor="let item of contentItems" class="editor-item" cdkDrag>
<div *ngIf="item.type === 'text'">
<div class="dropzone-placeholder reorder text" *cdkDragPlaceholder>
<p>{{ 'EDITOR.INSERT HERE' | translate }}</p>
</div>
</div>
<div *ngIf="item.type === 'image'">
<div class="dropzone-placeholder reorder image" *cdkDragPlaceholder>
<p>{{ 'EDITOR.INSERT HERE' | translate }}</p>
</div>
</div>
<app-language-tab-editor *ngIf="item.type === 'text'"></app-language-tab-editor>
<app-image-upload *ngIf="item.type === 'image'"></app-image-upload>
</div>
Почему CDK ведет себя по-разному, когда классы не установлены традиционным способом? И как мне избежать написания избыточного обходного пути, упомянутого выше?