7

我有一个 Angular2 组件使用 ng2-dragula 像这样拖放:

@Component({
  selector: 'my-comp',
  directives: [
    Dragula
  ],
  viewProviders: [
    DragulaService
  ],
  template: `
    <div class="my-div">
      <div *ngFor="#item of items" [dragula]='"card-bag"' [dragulaModel]='items'>
      ...
      </div>
    </div>
  `
})

我的问题:如果我创建多个“my-comp”组件,“card-bag”内的项目无法在这些组件中拖放,尽管它​​们具有相同的包名称。这些项目只能在其拥有的组件内拖放。

我们是否有任何用于跨组件拖放的配置,或者这是 ng2-dragula 限制?

谢谢。

4

2 回答 2

10

如果您不使用[dragulaModel],那么只要您只viewProviders: [ DragulaService ]在顶部/根组件中设置一次,那么在嵌套组件之间拖放就可以正常工作。

请记住不要设置viewProviders: [ DragulaService ]其他组件,因为它会为每个组件创建新实例。

编辑:最近我使用ng2-dndnpm 包实现了给定的场景。它比 ng2-dragula 更好,并提供简单的对象传递和其他功能。它可能会解决您的问题。

于 2016-05-24T09:46:47.793 回答
2

我有一个树结构拖放工作,如下所示:

顶级组件

  • CSS ViewEncapsulation.None,在此处包含任何 CSS
  • 德拉古拉指令
  • DragulaService ViewProvider
  • 在 Dragula 服务上注册一个accepts过滤器,以阻止项目被放入自身

    accepts: (el: Element, target: Element, source: Element, sibling: Element): boolean => {
     return !el.contains(target); // elements can not be dropped within themselves
    },
    
  • 在 Dragula 服务上注册一个moves过滤器,以便将整个项目一起移动

    moves: (el: Element, container: Element, handle: Element): boolean => {
      // only move favorite items, not the icon element
      return el.tagName.toLowerCase() === 'mvp-navigation-item';
    },
    
  • Html 模板看起来像这样

    <div class="nav--favorites__root" [class.is-dragging]="isDragging" [dragula]="'favorites'" [dragulaModel]="favoriteLinks">
      <navigation-item *ngFor="let link of links" [link]="link">
      </navigation-item>
    </div>
    

导航项组件

  • 德拉古拉指令
  • 没有 DragulaService ViewProvider
  • Html 模板看起来像这样

    <a href class="list-group-item" linkActive="active" [linkTo]="link?.url" (click)="followLink($event, link)">
      <span class="glyphicon glyphicon-{{link?.icon ? link?.icon : 'unchecked'}}"></span>
      <span class="nav__label">{{link?.label}}</span>
    </a>
    <div *ngIf="link?.children" class="list-group list-group-inverse nav--favorites__submenu" [class.is-expanded]="link?.isExpanded" [class.is-empty]="link?.children?.length === 0" [dragula]="'favorites'" [dragulaModel]="link?.children">
      <navigation-item *ngFor="let childLink of link?.children" [link]="childLink">
      </navigation-item>
      <!-- the nav favorites items must be the first elements in the dragula container or the model sync gets confused -->
      <a class="btn btn-link toggle" (click)="link.isExpanded = !link.isExpanded; $event.preventDefault();"><span class="glyphicon glyphicon-triangle-{{link?.isExpanded ? 'top' : 'bottom'}}"></span></a>
    </div>
    

您需要设置样式以使 .nav--favorites__submenu 在拖动项目时作为放置目标可见。

于 2016-06-16T16:28:09.337 回答