드래그 앤 드롭 기능에 ng2-dragula를 사용하고 있습니다. 마지막에 첫 번째 요소 (또는 모든 요소)를 끌어다 놓은 다음 addNewItem 버튼을 사용하여 배열에 새 항목을 추가하려고하면 문제가 발생합니다. 새 항목이 끝에 추가되지 않습니다. 요소를 끝까지 놓지 않으면 UI 끝에 새 항목이 추가됩니다. 어떤 시나리오에서든 새 항목이 맨 아래에 표시되기를 원합니다. 도움을 주시면 감사하겠습니다. 이 문제는 Angular 7에서 재현 할 수 없습니다. Angular 9에서 이런 일이 발생하는 것을 확인했습니다.
JS
export class SampleComponent {
items = ['Candlestick','Dagger','Revolver','Rope','Pipe','Wrench'];
constructor(private dragulaService: DragulaService) {
dragulaService.createGroup("bag-items", {
removeOnSpill: false
});
}
public addNewItem() {
this.items.push('New Item');
}
}
HTML
<div class="container" [dragula]='"bag-items"' [(dragulaModel)]='items'>
<div *ngFor="let item of items">{{ item }}</div>
</div>
<button id = "addNewItem"(click) = "addNewItem ()"> 새 항목 추가
문제를 시각화하는 데 도움이되도록 주석에서 stackblitz를 편집했습니다. 이것은 유닛을 목록의 맨 아래로 끌 때 트리거되는 것 같습니다. 업데이트 된 stackblitz : https://stackblitz.com/edit/ng2-dragula-base-ykm8fz?file=src/app/app.component.html Item AddedOutOfOrder
드롭시 이전 항목 위치를 복원 할 수 있습니다.
constructor(private dragulaService: DragulaService) {
this.subscription = this.dragulaService.drop().subscribe(({ name }) => {
this.dragulaService.find(name).drake.cancel(true);
});
}
Ivy와 ViewEngine이 특정 인덱스에 ViewRef를 삽입하는 방법에는 약간의 차이가 있습니다. 그들은 다른 beforeNode에서 중계합니다.
Ivy는 항목을 끝에 추가하면 항상 ViewContainer host (Comment node) ref를 반환합니다 .
export function getBeforeNodeForView(viewIndexInContainer: number, lContainer: LContainer): RNode|
null {
const nextViewIndex = CONTAINER_HEADER_OFFSET + viewIndexInContainer + 1;
if (nextViewIndex < lContainer.length) {
const lView = lContainer[nextViewIndex] as LView;
const firstTNodeOfView = lView[TVIEW].firstChild;
if (firstTNodeOfView !== null) {
return getFirstNativeNode(lView, firstTNodeOfView);
}
}
return lContainer[NATIVE]; <============================= this one
}
ViewEngine은 마지막으로 렌더링 된 노드 (마지막 <li/>
요소) 참조를 반환합니다.
function renderAttachEmbeddedView(
elementData: ElementData, prevView: ViewData|null, view: ViewData) {
const prevRenderNode =
prevView ? renderNode(prevView, prevView.def.lastRenderRootNode!) : elementData.renderElement;
...
}
해결책은 드래그 된 요소를 원래 컨테이너로 되돌려 내장 된 ngForOf
Angular 지시문이 스마트 디핑을 수행 하도록 할 수 있습니다 .
Btw, 동일한 기술이 Angular 재질에 사용됩니다 DragDropModule
. 드래그하는 요소의 위치를 기억하고 항목을 드롭 한 후 DOM의 이전 위치에 삽입합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다