【问题标题】:How to drag/drop to multiple Angular2 component using ng2-dragula如何使用 ng2-dragula 拖放到多个 Angular2 组件
【发布时间】:2016-06-29 02:55:00
【问题描述】:

我有一个 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 限制?

谢谢。

【问题讨论】:

  • 希望其他人可以加入,但我认为您必须在引导程序中将此作为全球服务才能获得这种功能。问题是当您在每个组件中单独导入它时,它会为每个组件创建一个新实例。如果将它添加到引导程序中,它是所有组件的全局附件。我希望这能回答您的问题!
  • @MorganG:谢谢。我也想过这个想法,但希望我们能有官方的或者更好的解决这个问题的办法。。
  • 我解决这个问题的一种方法是,我有一个服务,它是一个带有可观察对象列表的全局变量,我只是在我的其他部分中每次需要它时引用该可观察对象或对象应用。每当我需要另一个全局可观察对象或对象时,我只需将其添加到该服务中。但我同意必须以这种方式做所有事情似乎有点倒退。
  • @MorganG 你能用一些代码详细说明一下吗?我正在尝试做同样的事情,但不知道如何在全球范围内获得它。
  • @MorganG 你有这方面的 plnkr 吗?我有这个问题,除了我有组件的缩略图,我想在拖动缩略图时加载相应的组件

标签: javascript drag-and-drop angular dragula


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 ng2-dnd 的提及,这是一个很棒的发现,易于使用,效果很好!
  • 谢谢,ng2-dnd 太棒了,我的全部要求是能够在可拖放和可拖动的 div 之间传输数据,ng2-dnd 非常适合,我会推荐任何人 dnd 而不是 dragula。
【解决方案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 在拖动项目时作为放置目标可见。

【讨论】:

  • 子 Dragula 中的 No Dragula 指令会引发错误,例如“Dragula 不是本机属性”。它无法使用 [dragula] 启动任何标签,因为没有指定指令。不确定你的答案是否正确,我认为不是。
  • @BecarioSenior 在 RC5 之后,指令在 ngModule 中声明,而不是在单个组件中声明。除了这种变化,一切仍然有效。确保 DragulaService 在顶部组件或 ngModule 中声明,但不在子组件中声明,因为我们需要该服务的单个共享实例。
  • 不知道,谢谢!
  • 这个对我有用,但我找不到任何方法将例如 2 个下一个项目拖在一起。我有选择模式,但我不知道如何在拖动模式下保持一致......
猜你喜欢
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多