項目中場景:
項目中有這樣的一個彈框,這里面的表單元素都是動態生成的,我自己封裝的有一個表單組件。
輸入框和普通的 select 下拉框用的都是 elementui 框架里面的東西,只有下拉樹結構用的是 vue-treeselect 插件。
新增頁面沒問題,下拉框的數據都是 select 獲取焦點的時候才請求接口,然后渲染數據。但是編輯頁面是從接口獲取業務數據(業務數據是指帶有值的表單元素)直接賦值的,elementui 的輸入框和 select 下拉框都沒問題,但是 vue-treeselect 直接賦值(中文值)后面就會跟 (unknown) 。
上網搜文章,很多文章說的都是頁面初始加載的時候,下拉框里面只有 (unknown) ,只要把雙向綁定數據改為 null 就可以了。與我碰到的問題不一樣,我這個是編輯頁面,直接賦值之后,后面跟 (unknown) 的情況。
參考 treeSelect賦值后,后面跟(unknown) 這篇文章之后,了解到 vue-treeselect 是必須有下拉框的數據,直接賦值的時候,必須賦值 ID ,然后插件通過 ID 去匹配下拉框里面的數據,顯示出 ID 所對應的中文內容。
但是我這里是沒有下拉框數據的,因為下拉框數據是 select 下拉框獲取焦點的時候,才去請求接口數據渲染下拉框的選項。而且我動態生成表單的時候,也沒辦法給下拉框的樹結構單獨請求接口,里面涉及到數組的循環,還有請求接口的異步賦值,導致最后賦值的下拉框數據都是最后一項(如果不清楚這一點,可以參考這篇文章:js之常見問題--for循環中為什么點擊總是彈出最后一個i)。
解決方案:
先上代碼截圖:
表單組件中,下拉樹結構的數據綁定的是 item.options ,所以編輯界面的時候,直接生成一個 options 選項,里面只有一項數據,就是要綁定的數據,然后賦值的時候,直接賦值 guid 即可。
注意,這里不能直接賦值 name 了,也就是不能直接賦值中文,不然還是會出現 (unknown) 的情況,必須賦值 guid ,插件自己會通過 guid 去下拉選項中尋找 guid 對應的中文 name。
vue-treeselect 官網的下拉選項用的是 id 和 label ,我這里根據項目需求用的是 guid 和 name,因為我用 normalizer 轉化了一下,如下圖:
------------ 完結 ------------