我有一个Angular输入字段,其作用类似于自动完成下拉列表。
我在输入与现有数据匹配时显示建议。当焦点丢失时,我必须隐藏下拉列表。
<input type="text"
ng-model="ctrl.inputs.name"
ng-blur="ctrl.autocomplete.visible = false"
ng-keyup="ctrl.handleAutocomplete()"/> <!-- logic for suggestions -->
<div ng-repeat="name in ctrl.names" data-name"{{name.name}}"
ng-click="ctrl.setName($event)">
{{name.name}}
</div>
现在输入输入时,这很好用,我得到一个项目列表。
理想情况下,您单击列表中的项目以将其设置在控制器中。我已经在控制器中隐藏了这些建议 - ctrl.autocomplete.visible = false
。
但在选项ng-click
之前,输入会调用ng-blur
,这会隐藏下拉列表。所以我永远不会到达ng-click
。删除ng-blur
工作正常,但我需要在输入丢失焦点时隐藏下拉列表。
帮助感谢。
答案 0 :(得分:1)
删除
ng-blur="ctrl.autocomplete.visible = false"
来自
<input type="text"
ng-model="ctrl.inputs.name"
ng-blur="ctrl.autocomplete.visible = false"
ng-keyup="ctrl.handleAutocomplete()"/>
并设置
ctrl.autocomplete.visible = false;
在控制器文件中的ctrl.setName($event)
方法的最后。
答案 1 :(得分:0)
所以我扩展了我之前见过的指令,这应该可行。
<强>指令强>
var blurFocusDirective = function ($timeout) {
return {
restrict: 'E',
require: '?ngModel',
link: function (scope, elm, attr, ctrl) {
if (!ctrl) {
return;
}
elm.on('focus', function () {
elm.addClass('has-focus');
scope.$apply(function () {
ctrl.hasFocus = true;
});
});
elm.on('blur', function () {
$timeout(function() {
elm.removeClass('has-focus');
elm.addClass('has-visited');
}, 250);
});
}
};
};
app.directive('input', blurFocusDirective)
app.directive('select', blurFocusDirective);
此指令绑定到允许inputs
和select
字段。它会为所有输入字段has-focus
添加一个类,然后将焦点和类has-visited
添加到已访问过的所有字段(您可以使用has-visited
进行自定义验证,或者是你想要)。
我在$timeout
事件中添加了一个简短的blur
,以便在它消失之前可以点击兄弟元素(否则指令工作得太快你无法点击自动填充选项)。
<强> HTML 强>
ng-model
的输入字段会自动添加类。为了让css
选择器抓住兄弟姐妹,我将ng-repeat
包裹在div
中。
<input type="text"
ng-model="ctrl.inputs.name"
ng-keyup="ctrl.handleAutocomplete()"/>
<div class="autoComplete">
<div ng-repeat="name in ctrl.names" data-name"{{name.name}}"
ng-click="ctrl.setName($event)">
{{name.name}}
</div>
</div>
<强> CSS 强>
以下css
规则默认隐藏autoComplete
部分。但如果兄弟姐妹有has-focus
,则会显示autoComplete
div
。
.autoComplete {
color:#00F;
display:none; }
.has-focus + .autoComplete {
display:inline; }