RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 963020
Accepted
Виталий Шебаниц
Виталий Шебаниц
Asked:2020-03-29 19:51:04 +0000 UTC2020-03-29 19:51:04 +0000 UTC 2020-03-29 19:51:04 +0000 UTC

在模式窗口中打开表单时如何将焦点移动到按钮?

  • 772

我不明白为什么它不能正常工作。一切都很好,直到我将它添加input到模态窗口。如果是true,则一切正常:

在此处输入图像描述

但是,如果false,则窗口甚至不会出现(在控制台上它显示为好像它已经出现并且我按下了确定(即Enter)):

在此处输入图像描述

问题:为什么窗口没有出现时false?

main.component.ts

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';

@Component({
  selector: 'app-menu',
  templateUrl: './menu.component.html',
  styleUrls: ['./menu.component.less']
})
export class MenuComponent implements OnInit {

  constructor(private router: Router) { }

 elements = [
    {
      title: "Копия чека",
      src: "../../assets/test.png",
      items: [
        {
          title: "Копия чека",
          src: "../../assets/test.png",
          action: () => {
            //console.log("show");
            this.titleModal = "Сделать копию чека?";
            this.isShowedDialog = true;
            this.iconModal = "../../assets/info.png"

          },  
          callback: () => {
            console.log(this.resultDialog);
          }  
        },
        .........
      ]
  // для хождения по группам
  currentItemGroup: number = 1;
  maxItemGroup: number = this.elements.length;
  minItemGroup: number = 1;
  // для хождения по детям группы
  currentItem: number = 1;
  minItem:number = 1;
  maxItem: number;
  // в данный момент по группам ходим?
  isGroup: boolean = true;
  // настройки для модального диалогового окна
  titleModal;
  discriptonModal
  buttonArrayModal = [{title:'Ок',class:'btn-success'},{title:'Отмена',class:'btn-danger'}];
  widthModal = '40%';
  iconModal;

ngOnInit() {
    this.onKeyDown();
  }

  onKeyDown() {
    document.onkeydown = (e) => {
      if (e.key === 'F1') {
        e.preventDefault();
        return false;
      }
      this.maxItem = this.elements[this.currentItemGroup - 1].items.length;
      switch (e.keyCode) {
        case 13: {

          if (this.isGroup)this.goToItem();
          else {
            this.elements[this.currentItemGroup - 1].items[this.currentItem - 1].action();
          }
          break;
       }
     }
   }
 }

isShowedDialog:boolean = false;
  resultDialog:string;

  onDialogClick(result:string){
    this.resultDialog = result;
    this.isShowedDialog = false;
    this.onKeyDown();
    this.elements[this.currentItemGroup - 1].items[this.currentItem - 1].callback();
    this.refreshDialog();
  }

  refreshDialog(){
    this.titleModal = null;
    this.discriptonModal= null;
    this.buttonArrayModal = [{title:'Ок',class:'btn-success'},{title:'Отмена',class:'btn-danger'}];
    this.widthModal = '40%';
    this.iconModal = undefined;
  }

在 menu.component.html 中:

<app-dialog-window [title]="titleModal" [discription]="discriptonModal" [buttonArray]="buttonArrayModal" [width]="widthModal" [icon]="iconModal" [input]="{hasVisible: false}" (onClickButton)="onDialogClick($event)" *ngIf="isShowedDialog"></app-dialog-window>

和组件本身:

import { Component, OnInit, Input, Output , EventEmitter, AfterViewInit } from '@angular/core';
declare var $: any;

@Component({
  selector: 'app-dialog-window',
  templateUrl: './dialog-window.component.html',
  styleUrls: ['./dialog-window.component.less']
})
export class DialogWindowComponent implements OnInit,AfterViewInit {
  @Input() title = "Подтвердите действие";
  @Input() discription;
  @Input() buttonArray: Array<any>;
  @Input() width = '40%';
  @Input() icon;
  @Input() input;
  inputData:string;

  @Output() onClickButton:EventEmitter<string> = new EventEmitter<string>();

  currentTab = 1;
  minTab = 1;
  maxTab;

  constructor() {   }

  ngAfterViewInit(){
    if (this.input.hasVisible) $("input").focus();
    else {
      $("button")[0].focus();
    }
  }

  ngOnInit() {
    this.onKeyDown();
    this.maxTab = this.buttonArray.length;
  }

  onClick(element:any){
    this.onClickButton.emit(element.innerText);
  }

  onKeyDown(){
    document.onkeydown = (e) => {
      if (e.key === 'F1') {
        e.preventDefault();
        return false;
      }
      switch (e.keyCode) {
        //Enter
        case 13: {
          this.buttonArray.forEach(el => {
            if (el.title === "Ок")
            {
              console.log(this.input);
              if (this.input.hasVisible){
                this.onClickButton.emit(this.inputData);
              }
              else {

                this.onClickButton.emit(el.title);
              }
            }

          });
          break;
        }
        // backspace
        case 27: {
          this.buttonArray.forEach(el => {
            if (el.title === "Отмена")
            this.onClickButton.emit(el.title);
          });
          break;
          break;
        }
        //вверх
        case 38: {
          this.next();
          break;
        }
        //вниз
        case 40: {
          this.prev();
          break;
        }
      }
    }
  }

  next(){
    if (this.currentTab < this.maxTab) this.currentTab++;
  }

  prev(){
    if (this.currentTab > this.minTab) this.currentTab--;
  }

}

更新:

如果在

 ngAfterViewInit(){
    if (this.input.hasVisible) $("input").focus();
    else {
      $("button")[0].focus();
    }
  }

zakomentit //$("button")[0].focus();,然后出现窗口....但是在自动打开表单时如何将焦点转移到按钮上?

angular
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    overthesanity
    2020-03-29T23:16:29Z2020-03-29T23:16:29Z

    我不知道 jQuery 是如何工作的以及如何使用这个库,但据我所知$("button")[0],它会聚焦在 DOM 中找到的第一个按钮,你需要将按钮聚焦在模态中,你可以在没有 jQuery 的情况下做到这一点.

    每个组件都有一个元素的物理内存表示,它是使用您在selector. 它被称为ElemenentRef并且它是一个注入类。您需要将此类注入到组件的构造函数中DialogWindowComponent:

    export class DialogWindowComponent implements AfterViewInit {
      constructor(private host: ElementRef<HTMLElement>) {}
    
      public ngAfterViewInit(): void {
        const input = this.host.nativeElement.querySelector('input');
        // какой `button` если у вас их 2? Добавьте класс кнопке
        // которую нужно зафокусить
        const button = this.host.nativeElement.querySelector('button');
    
        if (this.input.hasVisible) {
          input.focus();
        } else {
          button.focus();
        }
      }
    }
    

    至少我们不会在整个树中寻找这些节点,而只会在 element 的范围内app-dialog-window。

    此外,您不会释放资源,每次打开模式窗口时,keydown都会在文档上注册一个新的事件处理程序。改用. @HostListener('document:keydown', ['$event'])_document.onkeydown = (e) => { ... };

    • 1

相关问题

  • 为什么排序在 mat-table 中不起作用?

  • 角度材料在角度 7 中不起作用

  • 以角度循环显示图像

  • Angular 密码比较验证器

  • 如何在 Angular 6 上向 sidenav 添加下拉元素?[关闭]

  • 一个组件中有两个指令。冲突

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5