前言
做一个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(能@的人名)'时要揭示被@的人。这样设置也能够去除当提交时@性能的执行。