【问题标题】:angular 5 - modal directive角度 5 - 模态指令
【发布时间】:2017-12-11 05:53:34
【问题描述】:

这是我第一次在 Angular 上使用 typescript。我一直在努力创建这个模态指令,灵感来自ngMorph

这按预期工作正常,但我遇到了一个非常奇怪的问题。当我单击按钮打开模态框时,它工作得很好,我关闭模态框,它就关闭了。当我尝试再次打开同一个模态框并尝试关闭时,它不会关闭。而且它也不会抛出任何错误。

调试后发现modal-button中的modal-active类没有被删除。

HTML

<div class="modal-button edit-sample-modal" [appModal] data-modal="edit-sample-modal">Open Modal</div>

<div class="custom-modal" id="edit-sample-modal">
    <a href="javascript:void(0)" class="text-default">
        <i class="fa fa-close fa-fw close-modal"></i>
    </a>
</div>

这是我的模态代码

import { Directive, ElementRef, AfterViewChecked, Input, HostListener } from '@angular/core';

@Directive({
    selector: '[appModal]'
})
export class ModalDirective implements AfterViewChecked {

    @Input()
    appModal: string;

    constructor(
        private element: ElementRef
    ) { }

    ngAfterViewChecked() {
        // function to go here
        this.initModalBox(this.element.nativeElement, this.element.nativeElement.getAttribute('data-modal'));
    }

    @HostListener('click') onclick() {
        this.initModalBox(this.element.nativeElement, this.element.nativeElement.getAttribute('data-modal'));

        const modalElement = document.getElementById(this.element.nativeElement.getAttribute('data-modal'));

        this.element.nativeElement.classList.toggle('modal-active');
        modalElement.classList.toggle('modal-open');
    }

    initModalBox(button: HTMLElement, modalDialog: string) {
        const trigger: HTMLElement = button;
        const triggerPos = trigger.getBoundingClientRect();

        const modalElement = document.getElementById(modalDialog);

        modalElement.style.top = `${triggerPos.top}px`;
        modalElement.style.left = `${triggerPos.left}px`;
        modalElement.style.height = `${triggerPos.height}px`;
        modalElement.style.width = `${triggerPos.width}px`;

        modalElement.style.position = 'fixed';

        const closeElement = modalElement.getElementsByClassName('close-modal')[0];

        closeElement.addEventListener('click', function () {
            modalElement.classList.toggle('modal-open');
            // this.element.nativeElement.classList.toggle('modal-active');
            document.getElementsByClassName(modalElement.getAttribute('id'))[0].classList.toggle('modal-active');
        });
    }
}

我知道代码并不完美,我只是在学习一些东西,到目前为止我已经想出了这个。我什至想知道使用 jQuery,但我不想使用它 Angular 项目,我试图在不使用 jQuery 的情况下以角度方式进行操作。任何帮助将不胜感激。

【问题讨论】:

  • data-modal="edit-sample-modal" 如果您看到这不是您的目标 ID。目标元素的 ID 是 edit-item-modal。您也可以使用 hostlistener 来关闭模态对话框。
  • 对不起,那是我的错误,当我更改实际的班级名称时,我忘记了这一点。当我第一次打开它时,我的模式一切正常,但是当我第二次打开模式时,我无法关闭它。 modal-active 没有被删除,尽管我有一个切换类 closeElement.addEventListener 的功能

标签: javascript angular angularjs-directive angular5


【解决方案1】:

对于带有打字稿的 Angular 中的模态,可以使用引导程序。 您可以在此链接中找到模态示例。 点击here

1:将 ModalModule 导入您的模块,如下所示:

import { ModalModule } from 'ngx-bootstrap';
@NgModule({
imports: [ModalModule.forRoot(),...]
})
export class AppModule(){}

2:将下面的行添加到您的 .html 文件中

<button type="button" class="btn btn-primary" (click)="staticModal.show()">Static modal</button>

<div class="modal fade" bsModal #staticModal="bs-modal" [config]="{backdrop: 'static'}"
     tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
  <div class="modal-dialog modal-sm">
    <div class="modal-content">
      <div class="modal-header">
        <h4 class="modal-title pull-left">Static modal</h4>
        <button type="button" class="close pull-right" aria-label="Close" (click)="staticModal.hide()">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        This is static modal, backdrop click will not close it.
        Click <b>&times;</b> to close modal.
      </div>
    </div>
  </div>
</div>

就是这样!

【讨论】:

  • 嘿,谢谢!我知道引导模态,我以这种方式创建它的原因,我正在做一个变形效果。如果我要使用 bootstrap 来完成,我将不得不再次编写这些函数来设置元素的位置。
  • @Saurav 嘿,你解决过这个问题吗?我也很想拥有一个 Angular 5 版本的 ngMorph
  • @Inigo 嘿,对不起,我没试过。其实没用过ngMorph
【解决方案2】:

这适用于 bootstrap 4.1.X 和 angular 6.0.X

modal.html

<!-- MODAL TRIGGER -->
<button class="btn btn-primary" data-toggle="modal" data-target="#myModal" appModal>Launch Modal</button>

<!-- MODAL -->

<div class="modal" id="myModal">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">Modal Title</h5>
        <button class="close" data-dismiss="modal" appModal>&times;</button>
      </div>
      <div class="modal-body">
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Temporibus unde veniam harum magnam molestias dignissimos omnis
        architecto, quod, obcaecati dolorum debitis dolore porro qui, iusto quo accusantium voluptates pariatur illo.
      </div>
      <div class="modal-footer">
        <button class="btn btn-secondary" data-dismiss="modal" appModal>Close</button>
      </div>
    </div>
  </div>
</div>

appModal.directive.ts

import { Directive, HostListener } from '@angular/core';

@Directive({
  selector: '[appModal]'
})
export class AppModalDirective {

constructor() { }

  @HostListener('click') modalOpen(){
    document.getElementById('myModal').classList.toggle('d-block');
  }
}

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 1970-01-01
    • 2016-06-02
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多