Я почти уверен, что делаю что-то действительно не так. У меня есть простой компонент, имеющий модель Dragula, и я не хочу принимать дубликаты при перетаскивании на него.
Чтобы проверить наличие дубликатов, я хочу использовать связанный массив dragula ngModel, который является свойством компонента (personInfoList), внутри функции accept для пакета, но поскольку это не параметр, он всегда пуст. Я знаю, что должен использовать цель, но это html-элемент, и поиск по нему и поиск, если перетаскиваемый элемент уже существует, не очень производительный.
Вот файл с машинописным текстом:
export class PersonGroupComponent implements OnInit {
@Input() templateData: string;
personInfoList: Array<PersonInfo> = [];
listGroup: Group;
constructor(private dragulaService: DragulaService) {
}
ngOnInit() {
this.listGroup = this.dragulaService.find(`personInfoList`);
this.listGroup.options.removeOnSpill = true;
this.listGroup.options.copy = (el, source) => { return source.id === 'sidebar' };
this.listGroup.options.copyItem = (person: PersonInfo) => { return new Person() };
this.listGroup.options.accepts = (el, target, source, sibling) => {
console.log(el);
const draggedElementId: number = parseFloat(el.querySelector('user-mgmt-person').id);
console.log(draggedElementId);
if (target.id !== 'sidebar' && !this.isInList(this.personInfoList, parseInt(el.id))) {
return true;
}
};
}
personModelChanged(event: Array<PersonInfo>) {
console.log('person list updated from drag event');
console.log(event);
}
isInList(list: PersonInfo[], id: number): boolean {
list.forEach(element => {
if (element.personId === id) {
return true;
}
});
return false;
}
Чтобы сделать вопрос более общим, есть ли другой способ поиска дубликатов при принятии перетаскиваемого элемента, кроме использования параметров из функции accept?