当前位置: 首页 > 知识库问答 >
问题:

以角度方式设置元素焦点

闾丘晨
2023-03-14

考虑到jquery的方式,但我想用angular的方式来实现这一点,我做了一个解决方案,我们使用元素的id在任何函数中设置焦点,所以,由于我在angular方面非常新手,我想了解一些意见,如果这种方式是正确的,有什么问题,无论什么,任何可以帮助我在angular中更好地实现这一点的方法。

基本上,我创建一个指令,监视用户用指令定义的作用域值,或者默认的focusElement,当该值与元素的id相同时,该元素会设置焦点本身。

angular.module('appnamehere')
  .directive('myFocus', function () {
    return {
      restrict: 'A',
      link: function postLink(scope, element, attrs) {
        if (attrs.myFocus == "") {
          attrs.myFocus = "focusElement";
        }
        scope.$watch(attrs.myFocus, function(value) {
          if(value == attrs.id) {
            element[0].focus();
          }
        });
        element.on("blur", function() {
          scope[attrs.myFocus] = "";
          scope.$apply();
        })        
      }
    };
  });

由于某种原因需要获得焦点的输入会这样做

<input my-focus id="input1" type="text" />
<a href="" ng-click="clickButton()" >Set focus</a>

和设置焦点的示例函数:

$scope.clickButton = function() {
    $scope.focusElement = "input1";
}

在Angular中这是一个很好的解决方案吗?它是否有我糟糕的经验还没有看到的问题?

共有1个答案

逑阳泽
2023-03-14

解决方案的问题是,当与创建新范围的其他指令(例如ng-repeat)绑定在一起时,它不能很好地工作。更好的解决方案是简单地创建一个服务函数,使您能够在控制器中强制地聚焦元素,或者在HTML中声明地聚焦元素。

演示

JavaScript

 .factory('focus', function($timeout, $window) {
    return function(id) {
      // timeout makes sure that it is invoked after any other event has been triggered.
      // e.g. click events that need to run before the focus or
      // inputs elements that are in a disabled state but are enabled when those events
      // are triggered.
      $timeout(function() {
        var element = $window.document.getElementById(id);
        if(element)
          element.focus();
      });
    };
  });
  .directive('eventFocus', function(focus) {
    return function(scope, elem, attr) {
      elem.on(attr.eventFocus, function() {
        focus(attr.eventFocusId);
      });

      // Removes bound events in the element itself
      // when the scope is destroyed
      scope.$on('$destroy', function() {
        elem.off(attr.eventFocus);
      });
    };
  });
.controller('Ctrl', function($scope, focus) {
    $scope.doSomething = function() {
      // do something awesome
      focus('email');
    };
  });
<input type="email" id="email" class="form-control">
<button event-focus="click" event-focus-id="email">Declarative Focus</button>
<button ng-click="doSomething()">Imperative Focus</button>
 类似资料:
  • 问题内容: 在查看了如何使用角度设置焦点元素的示例后,我看到它们中的大多数使用一些变量来监视然后设置焦点,并且它们中的大多数对于要设置焦点的每个字段使用一个不同的变量。在具有许多字段的形式中,这意味着存在许多不同的变量。 考虑到jquery的方式,但是想以角度的方式做到这一点,我提出了一个解决方案,我们使用元素的id将焦点设置在任何函数上,因此,由于我在角度上非常陌生,因此我希望得到一些意见那个方

  • 问题内容: 我在Angular 2中有一个名为my-comp的组件: 如何在Angular 2中设置此组件的宿主元素的样式? 在Polymer中,您将使用“:host”选择器。我在Angular 2中尝试过。但是它不起作用。 我也尝试使用组件作为选择器: 两种方法似乎都不起作用。 谢谢。 问题答案: 有一个错误,但在此同时已修复。现在工作正常。 还支持 用于匹配主机元素上的属性,类… 用于匹配父组

  • 问题内容: 我有一个带有文本框的Web表单。默认情况下,如何将焦点设置到文本框? 像这样: 所以有人可以帮我吗?我不知道如何使用JavaScript将焦点设置到文本框。 问题答案: 做这个。 如果您的元素是这样的。 您的脚本是

  • 如何在Elm中设置Html元素的焦点?我试图在元素上设置自动聚焦属性,它只在页面加载上设置焦点。

  • 问题内容: 您可以设置诸如,和的内联元素的宽度,但是在放置它们之前不会发现任何效果。 a)我认为不能设置内联元素的内联宽度? b)假设可以设置宽度-在放置内联元素之前,我们不会注意到任何效果(因此我们指定了宽度)。位置如何/在哪里? c)为什么仅当我们“定位”内联元素时才显示它们的宽度? 问题答案: 正如其他人提到的那样,设置内联元素的宽度(或其他一些与位置相关的属性)将导致浏览器将元素显示为块元

  • 问题内容: 在PhantomJS中进行测试时如何设置元素高度? 我正在使用Jasmine框架在Karma上进行测试,并在PhantomJS无头浏览器上运行。我正在尝试测试与“无限滚动”(当用户滚动到容器元素底部附近时自动加载项目)有关的AngularJS指令。我 不 使用jQuery,也不希望(除非没有其他方法)。我正在使用 .clientHeight , .scrollTop 和 .scroll