iT邦幫忙

1

(vue 可複選的選單)點A能撈出A底下的checkbox,點B也能撈出B底下的checkbox,但A底下的checkbox會消失要如何保留?

目標:根據選單撈出我要的checkbox。目前可以撈出我當下選項所對映tag_id的checkbox但前一個所選的會被當下的出現的checkbox取代掉因為this.options隨時會變的關係但也無法對他用push?

使用vue的Vue-multiselect第三方套件的tagging能複選的選單來使用,下拉選項來源是從db撈出而來放進coreData[],點擊選項後使用它的event方法@select來使用axios.post;

附上https://jsfiddle.net/s4vqh0aw/ 但這個不知道要如何用axios所以跟我底下的code不太一樣,只能看到UI有甚麼東西而已。
希望能透過點核心技能撈出我的checkbox,但目前只有點選項秀出屬於該核心技能的checkbox,無法因為複選了別的核心技能選項秀出所有的checkbox,只能秀最後所點擊的那個。

2021/12/30更新
目前還是失敗如上面jsfiddle的程式,但有參考froce大的做法把skills一起放在coredata裡,根據watch的方式去取得裡面物件的skills但取出來後要v-for時失敗,再想可能是因為skills的[]所影響?

<div id="vueapp">
    <label>核心技能選單</label>
    <multiselect v-model="selectedcoreObj"  placeholder="選擇核心技能" 
    label="tag_name" track-by="tag_id" :options="coreData" :multiple="true" 
    :taggable="true" @@select="select">
    </multiselect>
<pre class="language-json"><code>{{ selectedcoreObj  }}</code></pre>
    <label >技能標籤</label>
    <div>
    <fieldset>
        <span>
        <label v-for="option in options">
  <input type="checkbox" v-bind:value="option.skill_id" v-model="postdata" />
        <span>{{option.skill_name}}</span>
        </label>
        </span>
    </fieldset>
  </div>
</div>
<script>
   Vue.component('multiselect', window.VueMultiselect.default)
    //創建實體
    var app = new Vue({
            el: '#vueapp',        
            data() {
                return {
                    options: [],//撈出被選中屬於此核心底下的技能
                    coreData: [],//核心技能下拉選單 
                    selectedcoreObj: [],
                    selectedIds: [],//只取coreskill的id
                    skillObj:[],
                }
            },
        methods: {            
            getSkilltag(tag_id) {
                const postBody = { tag_id: tag_id };                                       axios.post('http://HaoweiLu.com/ITDNA.ApiService/api/Querysk/', postBody)
                        .then((res) => {
                            console.log(res.data);
                            this.options = res.data; //撈出checkbox    
                        })
                        .catch((error) => {
                            console.log(error);
                        })               
                },              
            select(selectedOption ) {
                this.getSkilltag(selectedOption.tag_id);
                },              
                getTag() {                                                                 axios.get('http://HaoweiLu.com/ITDNA.ApiService/api/QueryS/')
                        .then((res) => {
                            console.log(res);
                            this.coreData = res.data;
                        })
                },
            },
            created: function () {
                    this.getTag();   //核心下拉選單資料來源        
            },
            watch: {
                selectedObjects(newValues) {
                    this.selectedIds = newValues.map(obj => obj.tag_id);
                }
            },
    })       
    </script>
我只想知道一件事,是不是工程師的中文能力都比較不好。
還是不習慣標點符號排板打字?

先說,有時我也會。我只是好奇其它人會不會。常打「一口氣文」
抱歉,這也是一個問題我來整理一下
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
froce
iT邦大師 1 級 ‧ 2021-12-29 16:19:38
最佳解答

因為你的描述太雜亂了,只能幫你看個大概(國文很重要),你想要的應該是選擇核心技能後,下方技能測試標籤出現對應的選項?

我的建議是你連後端都應該重新設計,api丟的結果應該改成像下面這樣:

{
   "tag_id": 1,
   "tag_name": "Domain Service",
   "skills": [{"id": 1, "skill_name": "Windows AD"}, {"id": 2, "skill_name": "LDAP"}]
},

這樣你應該比較好處理。
你分開取得技能之後,單純的把技能存到options裡,當你使用者取消核心技能後,你會很難刪除技能測試標籤的內容,因為沒有對應。

回到正題,你現在應該在你選擇核心技能後,把options和res.data印出來,觀察看看你目前的選項。
因為我也不知道你res.data回應長什麼樣子,是不是JSON...

理論上options長怎樣,你的技能測試標籤那邊就會長怎樣。

看更多先前的回應...收起先前的回應...

froce大,我點一個選項的話console.log(JSON.stringify(res.data));
會是一個array裡面類似
[
{"skill_id":9,"skill_name":"SMTP"},{"skill_id":10,"skill_name":"Microsoft Exchange"},{"skill_id":11,"skill_name":"Exchange Online"},{"skill_id":12,"skill_name":"EMail Gateway/Anti-Spam"},
{"skill_id":13,"skill_name":"EMail Archive"}
]
下一行的this.options = res.data;
撈出以上那些技能的checkbox,但this.options會隨著不同的技能的按鈕變動checkbox,而無法保留因此才想看有甚麼方法儲存起來,但看來froce大的那個格式好像比較好整理我來想想看。

天黑 iT邦研究生 5 級 ‧ 2021-12-29 17:29:48 檢舉

也許你可以考慮做一個選單跟option的組合結構,選到時再取對應的options,如果沒有資料,再用API撈取新增到這資料物件裡,有資料就取目前的資料顯示

{
 [
   {
       id: 1,
       name:'domain service',
       options: [
           {
               id: 1,
               name : 'Microsoft xxxx',
               checked: true,
           },
           {
               id: 2,
               name : 'Dns',
               checked: false,
           }
       ]
   },
   {
       id: 2,
       name:'domain service2',
       options: [
           {
               id: 1,
               name : 'Microsoft xxxx',
               checked: false,
           },
           {
               id: 2,
               name : 'Dns',
               checked: false,
           }
       ]
   },
 ]
}

Froce 大對啊,我目前option長怎樣,技能測試標籤也是張怎樣但目前就會只顯示當下選項底下技能測試標籤的技能前一個的checkboxlist會被覆蓋掉不能保留

froce iT邦大師 1 級 ‧ 2021-12-29 20:18:19 檢舉

js的array有個method叫push...

對阿我有用,原本有宣告一個arr.push(res.data)放在下面的方法裡。然後return回去但撈出的跟我預期的不一樣失敗我就先移除了

 getSkilltag(tag_id) {
                const postBody = { tag_id: tag_id };                                       axios.post('http://HaoweiLu.com/ITDNA.ApiService/api/Querysk/', postBody)
                        .then((res) => {
                            console.log(res.data);
                            this.options = res.data; //撈出checkbox    
                        })
                        .catch((error) => {
                            console.log(error);
                        })               
                },       
froce iT邦大師 1 級 ‧ 2021-12-29 21:29:07 檢舉

push完看一下你的this.options長什麼樣子啊...
我相信他應該不會是你要的樣子

對阿昨天試完不是我要的樣子,我就上來詢問了@@。
原本是想透過https://jsfiddle.net/s4vqh0aw/
裡面watch的方式去回傳我所需的技能的sel來v-for的但可能因為[]的關係沒辦法顯示,目前只能用selectedObject的tag當checkbox來保留

froce iT邦大師 1 級 ‧ 2021-12-30 14:54:47 檢舉

我實在是看不太懂你要表達什麼,不過應該是要這樣吧...
https://jsfiddle.net/x98oyrLt/

你對vue的理解還不夠,你看我的code哪來那麼多methods和watch...

created把他當成接api回來就好。

對,我得承認我真的vue這周才學很多都還沒搞懂,這周的連假我會先看相關教學網站慢慢摸索!!剛剛看了網址原來v-for可以這樣連續使用我果然真的對vue的理解不夠,太感謝了

froce iT邦大師 1 級 ‧ 2021-12-30 16:19:58 檢舉

正式開發你的核心技能和技能檢定會變成2個父子組件,其實巢狀迴圈在vue裡並不鼓勵,但目前你先把vue學完再說吧。

好,的確我目前vue的component那裏都還沒有看跟學,尚未有概念

我要發表回答

立即登入回答