将一个元素集中在Aurelia

spe*_*men 8 javascript jquery aurelia

我想将焦点设置为表单元素.使用jQuery,这非常简单$('selector').focus.

我创建了一个简单的<input ref="xxx" id="xxx" type="text"> 在我的.ts文件中添加一个属性并在此处使用它:

attached() {
    this.xxx.focus()
}
Run Code Online (Sandbox Code Playgroud)

什么都没发生.开始觉得一些简单的事情变得越来越困难,我肯定从来都不是重点.

(原始用例是在显示折叠时将焦点设置为Bootstrap折叠中的表单元素,如下所示:

// set focus to the first element when the add-cell collapse is shown
$('#collapsedAddTask').on('shown.bs.collapse', function () {
    $('#AddTaskTitle').focus()
})
Run Code Online (Sandbox Code Playgroud)

这适用于我的基本HTML(不是单页应用程序),但不适用于Aurelia.Aurelia的方式是什么?

更新 使用下面的Miroslav Popovic的答案,并在评论中,我得到了它的工作(记住,这是一个Bootstrap崩溃组件):

<!-- the heading with an A that toggles visibility -->
<div class="panel-heading">
    <a href="#collapsedAddTask" data-toggle="collapse" id="addTaskHeader" click.delegate="addTaskShown()">Add task</a>
</div>
<!-- the body, which is initially hidden -->
<div class="panel-body">
    <div class="collapse" id="collapsedAddCell">
       <input type="text" focus.bind="addTaskFocused">
       <!-- more controls ... -->
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

Mir*_*vic 11

this.xxx.focus()因为focus()DOM元素上没有方法(编辑:显然现在有,但是Safari不支持它 - https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus,谢谢@classicalConditioning).jQuery补充说.Aurelia创建的参考指向一个普通的DOM元素.要使其工作,您需要导入jQuery和wrap元素:

import $ from 'jquery';

// ...

attached() {
    $(this.xxx).focus();
}
Run Code Online (Sandbox Code Playgroud)

无论如何,你应该避免在常规视图模型中使用jQuery.将它用于自定义元素和自定义属性是可以的,您需要与DOM交互或初始化一些jQuery插件.

focusAurelia中有一个自定义属性.您可以在Aurelia的博客文章中阅读更多相关信息.

基本上,它使您可以从视图模型中控制焦点.在你看来,你会有这样的:

<input type="text" focus.bind="hasFocus" value.bind="..."/>
Run Code Online (Sandbox Code Playgroud)

在视图模型中:

attached() {
    this.hasFocus = true;
}
Run Code Online (Sandbox Code Playgroud)

当然,您可能会将其用于更复杂的场景.即展开时聚焦输入collapse,或者将新项目添加到绑定的数组时repeat.for.

此外,focus属性实现双向绑定.在上面的示例中,它将相应地更改hasFocus属性的值.


And*_*rew 6

对于元素未隐藏并且您希望在视图加载完成后它具有焦点的情况,您可以简单地添加focus.one-time="true"如下:

<input
  type="text"
  class="form-control"
  focus.one-time="true"
  value.bind="email"
  placeholder="email address">
Run Code Online (Sandbox Code Playgroud)

  • @fracz,将 aurelia 的布尔属性的值设置为字符串 `"true"` 是一种不好的做法,因为它会产生错误的假设,即如果将其设置为 `"false"`,结果将相反。这是不正确的,因为在 javascript 中,字符串 `"true"` 和 `"false"` 都是真实的。 (2认同)
  • @classicalConditioning我非常确定,通过使用“.bind”(或“一次性”绑定,如此处所示),引号内的值_is_被视为Javascript,因此将按预期评估布尔值。 (2认同)