【问题标题】:AngularJS 1.x: Click radio button and sibling input element focusesAngularJS 1.x:单击单选按钮和兄弟输入元素焦点
【发布时间】:2017-04-24 04:48:15
【问题描述】:

我正在使用 Angular 1.5(使用 Bootstrap)处理表单,我想要以下功能:

当用户单击单选按钮时,我希望它专注于单选组中的输入文本元素,反之亦然(即用户单击输入文本元素并选中单选按钮)。

我在想我需要使用 ng-click 或 ng-change 并编写一个函数。但我被难住了。

代码如下:

<div class="radio-group">
    <input type="radio"
           name="phone"
           ng-model="contactMethod"
           value="phone"/>

    <label for="phoneNumber" class="radio-inline">Phone</label>

    <input type="text"
           id="phoneNumber"
           name="phoneNumberInput"
           ui-mask="(999) 999-9999"
           ng-model="phoneNum"
           class="form-control"/>
</div>

编辑:我收到了一个非常有用的答案,非常适合这种特定情况(见下文)。但我也想知道是否有办法概括解决方案,使其适用于多个单选按钮组。

【问题讨论】:

  • 所以你不希望它实际上同时关注两个方向。如果用户单击单选按钮,您希望光标(焦点)在输入文本字段上。如果用户单击文本字段,您希望选择单选按钮。但是您不希望它专注于单选按钮(这会很烦人,光标会离开文本字段)。我会尝试一个快速的示例,看看我是否可以让它工作。虽然这应该只是直接的 html/js,但不会打扰 Angular。基本的点击事件和焦点设置应该可以解决问题。
  • 没错。我对 Angular 比较陌生,所以我不知道是否有特定的“Angular”方法可以使用 $watch 之类的方法来实现。

标签: angularjs forms twitter-bootstrap


【解决方案1】:

这样做,单击文本字段并且RB选择(但光标停留在文本字段中),单击RB并且RB选择并且光标进入文本字段。

您也可以使用 ng-model 等的值来执行此操作,但是嗯。这是裸机的想法。如果 RB 已被选中,您可能需要添加检查以将其短路等等。

<script>
function onElemClick(elem) {
  if ( elem.id === 'phone_rb' ) {
    document.getElementById('phoneNumber').focus();
  } else if ( elem.id === 'phoneNumber' ) {
    document.getElementById('phone_rb').checked = 'checked';
  }
}
</script>

<div class="radio-group">
    <input type="radio"
           id="phone_rb"
           name="phone"
           onclick="onElemClick(this)"
           value="phone"/>

    <label for="phoneNumber">Phone</label>

    <input type="text"
           id="phoneNumber"
           name="phoneNumberInput"
           onclick="onElemClick(this)"
           ui-mask="(999) 999-9999"/>
</div>

【讨论】:

  • 好的。那么,如果我想将其抽象到一个级别(即我希望它对应用程序中的所有无线电组通用,例如电子邮件等)怎么办?这个例子是针对这种特殊情况的
  • 我实际上认为我可能已经回答了我之前的评论。但我也想看看你的想法。
  • 嗯,这就是你要求的。但是,您要么只想将函数放在某种 utils 文件中,要么更“角度”,创建一个单选按钮指令,您可以提供文本字段 ID。所以你的 RB 标记看起来像:
    IDS 必须是唯一的,这很好。在 rb 指令中,当单击包装的 HTML RB 时,您只需为输入的 ID 执行 document.select 并将焦点放在它上面,反之亦然。请注意,我认为您也可以使用一些花哨的 CSS 来做到这一点。不过那不是我的事。
  • 谢谢!我认为编写指令将是矫枉过正,因为这种情况在应用程序中只发生过几次。但这很高兴知道
  • 在 Angular 中,编写指令永远不会过大。这是 Angular 的地狱之一(我假设您使用的是 1.x)。一切都是样板,但你真的不应该尝试解决它,否则“它应该是一个角度指令”合唱会找到你。
猜你喜欢
  • 2013-03-09
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 2011-02-22
  • 1970-01-01
相关资源
最近更新 更多