使用 ng-click 将焦点设置在 div

Set focus on div with ng-click

我有以下问题(可能有点复杂和难以描述,但我尝试了):

我正在为我的 Web 应用程序中的某些数字字段构建一个带有 angularJS 的输入助手组件。

现在这个网络应用程序有很多代码和逻辑,所以我试着向你解释我们的组件是如何工作的:

每个组件都有自己的 html-模板,scss (css) 文件,以及两个类型脚本文件,一个是组件的指令,一个是模块,我们为整个应用程序设置它的地方。

所以我们的输入助手组件有以下文件:

HTML-模板(inputHelper.html):

<div class="wscNumberInputHelperComponent">
    <div class="cInputWithButton">
        <div ng-transclude></div>

        <div class="cInputButton" ng-click="ctrl.isHelperShown = true" wsc-tooltip="{data: ctrl.currentValue, template: '<wsc-number-input-helper-tooltip></wsc-number-input-helper-tooltip>', class: 'cNumberInputHelperTooltip', pointerPosition: 'End'}">
            <wsc-icon class="cInputAddonIcon" icon="ctrl.iconName"></wsc-icon>
        </div>
    </div>
</div>

比指令 (inputHelper.directive.ts),我们在其中处理 individual 组件标签等的绑定:

import {WsController} from '../../../shared/superclasses/controller';

export class WscNumberInputHelper extends WsController {
    static componentName = 'wscNumberInputHelper';
    static templateUrl = 'app/comp/wsComp/wscNumberInputHelper/wscNumberInputHelper.html';
    static componentOptions = {
        transclude: true,
        bindings: {
            iconName: '@',
            currentValue: '='
        }
    } as ng.IComponentOptions;
}

并且至少是模块 (inputHelper.module.ts),我们在其中为我们的模块设置它:

import {WscNumberInputHelper} from './wscNumberInputHelper.directive';
import {WscNumberInputHelperTooltip} from './wscNumberInputHelperTooltip/wscNumberInputHelperTooltip.directive';

let ngModule = angular.module('wsComp.wscNumberInputHelper', []);

WscNumberInputHelper.register(ngModule);
WscNumberInputHelperTooltip.register(ngModule);

所以这是相互连接的,当我们在任何输入字段周围放置我们的 individual 组件标签时,我们在输入字段的右侧得到一个带有图标的 div (在 html 模板中 div 和 class cInputButton.

现在,当我们单击此 div 时,我们会打开另一个组件(工具提示),其中包含我们的输入助手 html/logic。这发生在以下代码行 (template-html):

<div class="cInputButton" ng-click="ctrl.isHelperShown = true" wsc-tooltip="{data: ctrl.currentValue, template: '<wsc-number-input-helper-tooltip></wsc-number-input-helper-tooltip>', class: 'cNumberInputHelperTooltip', pointerPosition: 'End'}">

如您所见,我们的工具提示组件也与绑定一起工作,我们可以在绑定中提供必须显示的模板。该模板包含 div。现在,我想在我的输入助手的 div 上创建一个 ng-keypress 并找出按下了哪个键。我知道这是如何工作的,我必须像这样给我的 div 一个 tabindex:tabindex="0" 然后在我的输入助手的控制器中调用一个方法(它与上面的指令不同)就像这个:ng-keypress="pressedKey($event)"。比我能拿到钥匙。问题是,我的工具提示与我的输入助手不在同一个 html 中,它位于工具提示内,所以我必须再次点击我的输入助手的 div 才能真正设置焦点。当我使用按钮打开工具提示时,如何更早地执行此操作?

它非常复杂,如果问题难以理解,我很抱歉,但我不得不尝试一下,我没有想法。重要提示:工具提示中的 inputhelper html-template 也是一个自己的模板,具有自己的指令和 scss,它仅在同一模块 (inputHelper.module.ts) 中注册。

感谢和欢呼。

这是我的解决方案:

这是工具提示中我的输入助手组件的模板:

<div class="cInputHelper" tabindex="0" ng-keypress="ctrl.pressedKey($event)">
    <div class="cContainer">
        <div class="cKeys">
            <div class="cKey" ng-repeat="key in ctrl.keys" ng-click="ctrl.modifyValue(key.value)">{{key.label}}</div>
        </div>
        <div class="cSideView">
            <div class="cSideViewItems">
                <span ng-if="!ctrl.lastInputsList.length">Keine Vorschläge (HC)</span>
                <div class="cSideViewItem cLastValue" ng-repeat="item in ctrl.lastInputsList">{{item.value}}</div>
            </div>
            <div class="cSideViewItem cSubmit">OK (HC)</div>
        </div>
    </div>
</div>

在 class cInputHelper 上,我有 tabindexng-keypress 用于处理 div 上的按键事件。这仅在我的 div 也有焦点时有效。所以来自 angularJS 的每个组件都有 $onInit() 方法,它是组件的构造函数(参见:https://docs.angularjs.org/guide/component)所以我使用 jQuery 来设置我的焦点div 像这样:

$onInit() {
    $(".cInputHelper").focus();
}

之后就可以了!

顺便提个好消息: ng-keypress 只适用于 inputtextarea 等可编辑元素。如果您想在 div 上对像我这样的其他人使用 in,你必须给这个元素一个 tabindex 并且还要将焦点放在它上面。比 ng-keypress 也适用于不可编辑的元素。

干杯。