【发布时间】:2015-08-29 23:17:10
【问题描述】:
我正在尝试构建一个 Angular Tag 指令,该指令的功能与 Stack Overflow 的 Tag 输入表单不太相似。它使用带边框的 div 来创建表单的错觉,然后在输入字段左侧使用包含标签列表的 div,您可以在其中键入:
<div class="wrapper">
<div class="tag-wrapper">
<div class="tags" ng-repeat="tag in selectedTags">
<div>
[[ tag.name ]]
<span class="remove" ng-click="removeTag(tag)"></span>
</div>
</div>
</div>
<input type="text" class="tag-input"
ng-model="tagInput"
ng-style="{ width: inputLength + 'px'}"
ng-keypress="tagInputKeyPress($event)"
ng-keyup="updateSuggestionList()"
ng-focus="toggleSuggestionVisibility()"
ng-blur="toggleSuggestionVisibility()" />
</div>
请注意,我使用 [[]] 作为 Angular 的插值提供程序,因为我有另一个模板引擎已经在使用 {{}}。
当在输入中按下一个键时,它会运行一个函数来检查该键是退格键还是回车键或空格以创建/删除标签:
$scope.tagInputKeyPress = function(event) {
// Currently using jQuery.event.which to detect keypresses, keyCode is deprecated, use KeyboardEvent.key eventually:
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
// event.key == ' ' || event.key == 'Enter'
if (event.which == 32 || event.which == 13) {
event.preventDefault();
// Remove any rulebreaking chars
var tag = $scope.tagInput;
tag = tag.replace(/["']/g, "");
// Remove whitespace if present
tag = tag.trim();
$scope.createTag(tag);
// event.key == 'Backspace'
} else if (event.which == 8 && $scope.tagInput == "") {
event.preventDefault();
// grab the last tag to be inserted (if any) and put it back in the input
if ($scope.selectedTags.length > 0) {
$scope.tagInput = $scope.selectedTags.pop().name;
}
}
$scope.inputLength = $(element).find('input.tag-input').parent().innerWidth() - $(element).find('.tag-wrapper').outerWidth() - 1;
return true;
};
我遇到的问题是 return 语句之前的最后一行。 它的目的是重新计算.tag-wrapper元素的宽度,并通过ng-style属性调整input元素的宽度以适应:
ng-style="{ width: inputLength + 'px'}"
但是,就目前而言,输入长度总是比 UI 落后一步,从而导致输入溢出。这是因为:
- 它首先将一个新标签添加到
selectedTags列表中。 - 它计算
.tag-wrapper的宽度。 - 它返回 true 让原始按键事件通过
- Angular 的摘要循环运行并将新标签附加到 DOM 中。
.tag-wrapper的宽度现在变大了,input溢出了。
这是一个例子:
现在,第 4 步在第 2 步之后进行。我需要在第 4 步之后进行第 2 步。
我怎样才能做到这一点?
【问题讨论】:
标签: javascript jquery angularjs dom angularjs-digest