共计 981 个字符,预计需要花费 3 分钟才能阅读完成。
前言
做一个 issue,要求是这样的
他说的 @是相似于这样的
当输出 @时,会弹出能够 @的用户列表。
解决
一开始想到从 html 层面解决,看看 input 标签有没有能够限度输出内容。
<input οnkeyup="value=value.replace(/[^0-9]/g,'')"οnpaste="value=value.replace(/[^0-9]/g,'')" oncontextmenu = "value=value.replace(/[^0-9]/g,'')">
查到能够增加几个事件,上述代码为限度 input 输出内容为数字。onkeyup 事件每当输出就会执行,咱们设置一个办法,替换非数字为空。外面检测非数字用到了正则表达式。
onpaste 事件每当粘贴时执行,咱们设置同样的办法。
oncontextmenu 事件很少用到,感兴趣的能够理解理解。
批改为替换规定为当检测到 ‘@’ 时替换为空。测试输出并没有弹出能够 @的用户列表。这种禁止输出并不是输出 @没有反馈,而是输出 @会呈现 0.5 秒而后再隐没。
接下来就是把这种事件变为动静,当为合作伙伴时,启用事件,当部位合作伙伴时,不启用事件。
过后这么写的,而后没有失效,没找到问题。而后认真一想,发现如果写进去也不太对,如果输出一个邮箱地址的话,咱们这样就没法输出 @符号了,咱们只想他不弹出用户列表,最初导致无奈输出 @符号了。
老师也倡议这么写不太好,这相当于退出一个监听,当监听到输出 @符号时,将 @符号用空替换。而弹出用户列表相当于另一个监听,当监听到 @符号时去弹出用户列表。两个监听事件可能并没有影响,所以不起作用。
如果不想弹出用户列表,咱们把用户列表暗藏掉就好了。
找到相干 html 代码,而后加上*ngIf = "false"
,后果并没有暗藏掉,一度狐疑本人找错相干 html 代码了。
问了老师后,发现这是一个 angular 的 ng-template 模版标签,ng-template 并不会被页面渲染,而是会被替换成咱们定义的要显示的理论内容。所以 ngif 并没有失效。
扭转思路,咱们将 @的用户列表设置为空,这样其实当输出 @时也会触发弹出用户列表事件,然而用户列表为空,所以看起来是不显示的。
能 @一个人,不仅仅当输出 @时能弹出用户列表,还要在提交输出内容时检测到含有 ’@XXX(能 @的人名)’ 时要揭示被 @的人。这样设置也能够去除当提交时 @性能的执行。