目標:根據選單撈出我要的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>
因為你的描述太雜亂了,只能幫你看個大概(國文很重要),你想要的應該是選擇核心技能後,下方技能測試標籤出現對應的選項?
我的建議是你連後端都應該重新設計,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大的那個格式好像比較好整理我來想想看。
也許你可以考慮做一個選單跟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會被覆蓋掉不能保留
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);
})
},
push完看一下你的this.options長什麼樣子啊...
我相信他應該不會是你要的樣子
對阿昨天試完不是我要的樣子,我就上來詢問了@@。
原本是想透過https://jsfiddle.net/s4vqh0aw/
裡面watch的方式去回傳我所需的技能的sel來v-for的但可能因為[]的關係沒辦法顯示,目前只能用selectedObject的tag當checkbox來保留
我實在是看不太懂你要表達什麼,不過應該是要這樣吧...
https://jsfiddle.net/x98oyrLt/
你對vue的理解還不夠,你看我的code哪來那麼多methods和watch...
created把他當成接api回來就好。