前言
做一個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並沒有生效。
其實*ngIf = "false"
,就是通過ng-template實現的,我們寫一個程式碼<div *ngIf="hero" >{{hero.name}}</div>
,這個程式碼會被解析為
<ng-template [ngIf]="hero">
<div>{{hero.name}}</div>
</ng-template>
*ngif只是一個簡寫,實際跟上述程式碼效果相同。這種簡化書寫並有相同功能成為語法糖。比如 java 中Integer integer = 12;
寫法與Integer integer = new Integer(12);
寫法效果相同。為簡化寫法,我們一般採用第一種。
最後會被替換成一個注視
改變思路,我們將@的使用者列表陣列設定為空,這樣其實當輸入@時也會觸發彈出使用者列表事件,但是使用者列表為空,所以看起來是不顯示的。
能@一個人,不僅僅當輸入@時能彈出使用者列表,還要在提交輸入內容時檢測到含有'@XXX(能@的人名)'時要提醒被@的人。這樣設定也可以去除當提交時@功能的執行。