我有一个函数,当他们开始用@键入时自动填充用户名(类似于instagram) 当您键入@时,会出现一个用户列表,用户可以单击列表中的项目/用户“ex:@ User1”,脚本会在textarea“ex:@ User1”中使用用户名自动填充@。
第一次替换是“ex:@ User1”。但是当用户键入第二个@(而不是第一个字母)并且列表再次出现然后点击列表中的其他项目/用户时,所选项目/用户“ex:@ User2”将在第一个中添加@在第一个建议“ex:@ User2User1”前面。但另一方面,如果用户键入第二个@ WITH第一个字母,然后点击列表中的项目/用户,那么替换就可以了。
这是我目前的职能:
var string = $scope.searchParam;
var pattern = /@\b.+?\b/g;
$scope.match = string.match(pattern)
if($scope.match){
value = $scope.match.pop();
console.log('match')
}else{
console.log('was undefined');
var pattern = /@/g;
var found = string.match(pattern)
console.log(found +' is value');
if(found.length > 0){
value = found.pop();
}
}
string = string.replace(value, '@'+suggestion);
console.log('oke');
$scope.searchParam = string;
$scope.searchFilter = string;
我还试图检查它是否已经存在只是在@sign之后输入一个字符时触发:
if(watching && typeof $scope.searchParam !== 'undefined' && $scope.searchParam !== null) {
var string = $scope.searchParam;
var pattern = /@\b.+?\b/g;
$scope.match = string.match(pattern)
if($scope.match){
console.log($scope.match.length + 'match aantal' + $scope.i + ' i aantal');
$scope.matches.push($scope.match);
console.log($scope.matches);
var found = $filter('filter')($scope.matches,$scope.match,true)
if (!found.length) {
$scope.i++;
}
}
$scope.completing = true;
$scope.searchFilter = $scope.searchParam;
$scope.selectedIndex = -1;
}
但匹配只有几个字母,所以这个数组被淹没了。这个问题可能有多个答案,我想知道在这种情况下你会采取什么措施。
答案 0 :(得分:0)
问题出在这一行:
string = string.replace(value, '@'+suggestion);
如果您只输入@
,则会替换第一个 @
。为避免这种情况,您必须匹配最后一个:
string = string.replace(new RegExp(value+'$'), '@'+suggestion);
只有当它位于字符串的末尾时才会匹配该值,这正是您所需要的。
您可以查看on codepen。