html - 将另一个元素传递给 ng-click
问题描述
我想创建一个项目列表,它们是简单的可点击文本。每次单击一个项目时,它都会转换为输入(文本框),您可以对其进行编辑。我已经这样做了。我唯一缺少的是在单击项目时将焦点设置在输入元素上。我的 HTML 代码如下:
<div ng-repeat="item in items">
<span ng-if="!valueIsEditedForItem(item.id)">
<a href="" ng-click="editValueForItem(item.id)">
{{ item.value }}
</a>
</span>
<span ng-if="valueIsEditedForItem(item.id)">
<input ng-model="edited_value"
ng-keyup="onValueInput($event, item.id, edited_value)"/>
</span>
</div>
<a>
元素和<input>
元素是两个不同的元素。所以,我的想法是以某种方式将输入元素传递给ng-click="editValueForItem(item.id)
. 它应该看起来像这样:
<a href="" ng-click="editValueForItem(item.id, inputElement)">
{{ item.value }}
</a>
然后我可以通过这样做将焦点设置到输入元素:
inputElement.focus();
我知道该$event
变量将事件的元素保存在$event.target
. 但我的活动是 on<a>
而不是 on <input>
。如何将<input>
元素引用到 中<a>
?
编辑:解决方案
从答案中阅读解决方案建议后,我最终通过 id 引用实现了这一点:
HTML
<input id="{{'input' + item.id}}"
ng-model="edited_value"
ng-keyup="onInput($event, item.id, edited_value)"/>
JS
$scope.editValueForItem = function (itemId) {
$scope.currentlyEditedItemId = itemId;
// focus on the input element
setTimeout(function () {
var inputElement = document.getElementById("input" + itemId);
if (inputElement) {
inputElement.focus();
}
}, 0);
};
该setTimeout
子句必须优先考虑元素的初始化。如果删除它,则该getElementById
命令将返回 null,因为输入元素尚未初始化。
但是,创建我自己的指令的解决方案将是一个更合适的选择。
解决方案
一种解决方案是传递$event
给函数并使用以下方法查找输入$event.target
:
<a href="" ng-click="editValueForItem($event)">
{{ item.value }}
</a>
editValueForItem = function($event) {
let $target = angular.element($event.target);
let nextInput = $target.parent().parent().find('input')[0];
if (nextInput.length) {
nextInput.focus();
}
}
推荐阅读
- java - Spring + R2DBC:如何关闭 DatabaseClient 和 TransactionalOperator?
- machine-learning - 当其中一个标签的比例几乎为空时的二元决策树模型
- javascript - PDFmake 表格动态数据
- python - 如何打印出 JSON 输出的确切字段/字符串?
- javascript - 比较对象数组并删除特定项目
- python - 如何在文本文件中搜索某行的内容、替换该行并另存为新文件?
- ruby-on-rails - 有哪些方法可以减少新的 ruby on rails 自动生成应用程序的体积?
- c# - 为什么我的 Ajax 帖子在转到后端时有内容,但我的模型和控制器收到 null
- python - 如何从本地 Docker 容器中从 S3 中提取数据
- bash - 在终端使用 vi 模式 (xterm) 时,我可以查看我处于哪种模式?