gpt4 book ai didi

javascript - Textarea ng-bind,其中值有前缀和后缀

转载 作者:太空狗 更新时间:2023-10-29 14:20:23 27 4
gpt4 key购买 nike

在我看来,我正在尝试完成一些应该相当简单的事情。在使用文本输入之类的东西时也是如此。我正在尝试在 textarea 上创建模型绑定(bind),当用户键入时,其中的值显示有前缀和后缀。前缀和后缀是引号:

“My awesome quote”

问题是,我目前正在使用 ng-model,我当然不能将其用于此目的。我在考虑绑定(bind)到一个变量,保存没有前缀和后缀的值,然后观察那个变量。当具有原始值的变量发生变化时,我会将带有前缀和后缀的值写入范围内的另一个变量。当用户键入时,该变量将显示在文本区域中。唯一的问题是,与输入字段不同,文本区域没有值属性。

这可能吗?

编辑

如果我在何处使用输入文本字段实现此目的,我会创建一个名为 A 的变量,以保存在用户键入时更改的原始值。当 A 发生变化时,我将获取原始值,在其周围加上引号并将新值存储在另一个变量中,也在范围内。这个新变量叫做 B

然后输入字段将在 A 变量上使用 ng-bind,并使用输入字段值属性显示 B 变量的内容。如下所示:

<input type="text" ng-bind="A" value="{{B}}">

我现在没有时间制作 fiddle ,但我会在本周晚些时候尝试制作。上面的描述都是理论上的,因为我还没有测试过。

最佳答案

您的需求很有趣,可以分为两个主要功能:

1。在不影响模型值的情况下为 View 值添加前缀和后缀

这是使用 NgModelController 实现的.我在 ngModelController.$viewValue 上创建了一个观察者,每当它发生变化时,如果它不包含前缀或后缀,我就会添加这些值。

2。不允许用户干扰前缀或后缀

这有点棘手,但我找到了a clever way on SO获取和设置输入或文本区域元素的插入符位置。

这是一个工作示例:

angular
.module('myApp', [])
.directive('beautifyText', function() {
return {
link: function(scope, iElement, iAttrs, ngModelController) {
// Adds the prefix and suffix
(function() {
var prefix = iAttrs.beautifyTextWithPrefix;
var suffix = iAttrs.beautifyTextWithSuffix;

ngModelController.$parsers.push(function(value) {
if (angular.isString(value)) {
return value.replace(new RegExp('^' + prefix), '').replace(new RegExp(suffix + '$'), '');
}

return '';
});

scope.$watch(function() {
return ngModelController.$viewValue;
}, function(newValue) {
if (angular.isString(newValue) && newValue.length > 0) {
if (angular.isString(ngModelController.$modelValue) && ngModelController.$modelValue.length === 0 && newValue.length === 1) {
ngModelController.$viewValue = '';
ngModelController.$render();
return;
}

if (!isBeautifiedWithPrefix(newValue)) {
ngModelController.$viewValue = prefix + newValue;
}

if (!isBeautifiedWithSuffix(newValue)) {
ngModelController.$viewValue = newValue + suffix;
}

ngModelController.$render();
} else {
ngModelController.$viewValue = '';
ngModelController.$render();
}
});

function isBeautifiedWithPrefix(value) {
return value.match(new RegExp('^' + prefix)) !== null;
}

function isBeautifiedWithSuffix(value) {
return value.match(new RegExp(suffix + '$')) !== null;
}
})();

// Changes the caret position
(function() {
var element = iElement[0];

// https://stackoverflow.com/questions/7745867/how-do-you-get-the-cursor-position-in-a-textarea#answer-7745998
function getCursorPos() {
if ("selectionStart" in element && document.activeElement == element) {
return {
start: element.selectionStart,
end: element.selectionEnd
};
} else if (element.createTextRange) {
var sel = document.selection.createRange();
if (sel.parentElement() === element) {
var rng = element.createTextRange();
rng.moveToBookmark(sel.getBookmark());
for (var len = 0; rng.compareEndPoints("EndToStart", rng) > 0; rng.moveEnd("character", -1)) {
len++;
}
rng.setEndPoint("StartToStart", element.createTextRange());
for (var pos = {
start: 0,
end: len
}; rng.compareEndPoints("EndToStart", rng) > 0; rng.moveEnd("character", -1)) {
pos.start++;
pos.end++;
}
return pos;
}
}
return -1;
}

// https://stackoverflow.com/questions/7745867/how-do-you-get-the-cursor-position-in-a-textarea#answer-7745998
function setCursorPos(start, end) {
if (arguments.length < 2) {
end = start;
}

if ("selectionStart" in element) {
element.selectionStart = start;
element.selectionEnd = end;
} else if (element.createTextRange) {
var rng = element.createTextRange();
rng.moveStart("character", start);
rng.collapse();
rng.moveEnd("character", end - start);
rng.select();
}
}

iElement.bind('mousedown mouseup keydown keyup', function() {
if (ngModelController.$viewValue.length > 0) {
var caretPosition = getCursorPos();

if (caretPosition.start === 0) {
setCursorPos(1, caretPosition.end < 1 ? 1 : caretPosition.end);
}

if (caretPosition.end === ngModelController.$viewValue.length) {
setCursorPos(caretPosition.start, ngModelController.$viewValue.length - 1);
}
}
});
})();
},
restrict: 'A',
require: 'ngModel'
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>

<div ng-app="myApp">
<textarea ng-model="myVariable" beautify-text beautify-text-with-prefix="“" beautify-text-with-suffix="”"></textarea>
<p>myVariable: {{ myVariable }}</p>
</div>

关于javascript - Textarea ng-bind,其中值有前缀和后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38009327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com