twitter-bootstrap - 如何使 Bootstrap 模态弹出窗口在 Angular2 中可移动

标签 twitter-bootstrap angular angular2-template

我的 Angular2 应用程序中有一个 Bootstrap 模式弹出窗口。我希望它是可拖动的。如果有人可以帮助我解决此问题,那将非常有帮助。

<div class="modal modal-sm fade fade in" [class]="modalWorkPhone" id="myModal" role="dialog">
   <div class="modal-dialog"> 
   <!-- Modal content-->
     <div class="modal-content">
       <div class="panel-heading" style="background-color:#2e90bd">
       </div>
     </div>
   </div>
</div>

最佳答案

以下指令代码适用于 Angular 6+ 和 ng-bootstrap 中的模态窗口图书馆。

您必须使该指令对您的 View 模块可见,并且所有模态都将变为可拖动而无需任何更改,因为该指令绑定(bind)到 .modal-header类(class):

import { Directive, ElementRef, Renderer2, AfterViewInit, Input, OnDestroy } from '@angular/core';
import { fromEvent, Subscription } from 'rxjs';
import { mergeMap, takeUntil, tap } from 'rxjs/operators';

interface Point {x: number, y: number};

@Directive({
  selector: '.modal-header'
})
export class DragModalDirective implements AfterViewInit, OnDestroy  {

  constructor (
    private el: ElementRef,
    private renderer: Renderer2,
  ) {}

  subscription: Subscription;

  start: Point;
  offset: Point = {x: 0, y: 0};

  ngAfterViewInit() {       

    setTimeout(() => {
      this.makeItDraggable();      
    });

  }  

  private makeItDraggable() {

    const modalDialogElement = this.el.nativeElement.closest(".modal-dialog");

    if (!modalDialogElement) {
      console.error('DragModalDirective cannot find the parent element with class modal-dialog')
      return;
    }

    this.renderer.setStyle(this.el.nativeElement, 'user-select', 'none');
    this.renderer.setStyle(this.el.nativeElement, 'cursor', 'move'); 

    this.renderer.setStyle(modalDialogElement, 'transition', 'none');

    const down$ = fromEvent(this.el.nativeElement, 'mousedown')
    const move$ = fromEvent(document, 'mousemove');
    const up$ = fromEvent(document, 'mouseup')

    const drag$ = down$.pipe(        
      tap(($event: MouseEvent) => {
        this.start = {
          x: $event.clientX - this.offset.x, 
          y: $event.clientY - this.offset.y
        };
      }),
      mergeMap(down => move$.pipe(
        takeUntil(up$)
      ))
    );

    this.subscription = drag$.subscribe(($event: MouseEvent) => {
      this.offset = {
        x: $event.clientX - this.start.x,
        y: $event.clientY - this.start.y
      }

     this.renderer.setStyle(modalDialogElement, 'transform', `translate(${this.offset.x}px, ${this.offset.y}px)`);
    }) 
  }

  ngOnDestroy() {
    if (this.subscription)
      this.subscription.unsubscribe();
  } 
}

关于twitter-bootstrap - 如何使 Bootstrap 模态弹出窗口在 Angular2 中可移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45281473/

相关文章:

html - Bootstrap 网格项在下一行错误对齐

ios - Angular 2,iOS Safari 错误 : eval@[native code]

Angular Material 2 : How to overwrite Dialog max-width to 100vw?

angularjs - 如何在模板中绑定(bind)标签p?

javascript - 选择使用 Angular 2 显示所选值的对象

html - 翻转 Bootstrap 缩略图时 div 的绝对定位

javascript - 基于 URL 中的 HASH 打开 Bootstrap 模式

html - 缩小堆叠图像以适合 parent 的高度

android - 获取 ionic 存储中的所有存储 key

css - Angular 2 : Styling router-outlet to have width < 100%