将另一个元素传递给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中事件的元素。但是我的活动是在<a>上而不是<input>上。 如何将<input>元素引用到<a>


编辑:解决方案

在阅读完答案中的解决方案建议后,我终于通过引用id来实现了这一点:

HTML

<input id="{{'input' + item.id}}"
       ng-model="edited_value"
       ng-keyup="onInput($event,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,因为输入元素尚未初始化。

但是,创建自己的指令的解决方案将是更合适的选择。

mumaren36 回答:将另一个元素传递给ng-click

一种解决方案是将 { "data": { "ID": "1","user_login": "jerry.abraham@kccc.come","user_pass": "$P$B2yv.gPx6pYXvnO6u59zkGZdUhXddddXRw.","user_nicename": "jerry-abrahameeee","user_email": "jerry.abraham@eee.com","user_url": "","user_registered": "2019-10-09 07:05:56","user_activation_key": "","user_status": "0","display_name": "jerry.abraham@wewewew.ae" },"ID": 1,"caps": { "administrator": true },"cap_key": "wp_capabilities","roles": ["administrator"],"allcaps": { "switch_themes": true,"edit_themes": true,"edit_others_user_registrations": true,"publish_user_registrations": true,"read_private_user_registrations": true,"delete_user_registrations": true,"delete_private_user_registrations": true,"delete_published_user_registrations": true,"delete_others_user_registrations": true,"edit_private_user_registrations": true,"edit_published_user_registrations": true,"manage_user_registration_terms": true,"edit_user_registration_terms": true,"delete_user_registration_terms": true,"assign_user_registration_terms": true,"manage_email_logs": true,"administrator": true },"filter": null } 传递给函数并使用 const title = responseData.map(item => { return { label: loopingResult(item),value: item._id }; }); function loopingResult(item) { for (var i = 0; i < item.registration.length; i++) { const result = `${item.title} ${item.registration[i].registration_type.code}`; return result.split(','); } } 查找输入:

$event
$event.target
,

直接方法是添加一些参考,例如:

<input ng-model="edited_value" editable="{{item.id}}"
       ng-keyup="onValueInput($event,item.id,edited_value)"/>
// editValueForItem method
$timeout(() => angular.element(document.querySelector('[editable="' + itemId + '"]')).focus())

另一个可能是:

<input ng-model="edited_value" take-focus-on-init
       ng-keyup="onValueInput($event,edited_value)"/>

其中take-focus-on-init是链接功能中焦点元素的指令。

第三个是发出指令:

<editable value="item.value"></editable>

含模板:

<div ng-if="!inEditMode">{{item.value}}</div>
<div ng-if="inEditMode"><input ...</div>

在这里您可以使用简单的element.find('input').focus()

本文链接:https://www.f2er.com/3058799.html

大家都在问