Vue - 表單雙向綁定

  • 701
  • 0
  • Vue
  • 2019-06-27

1. single checkbox / multi checkbox

進階 multi checkbox

2.radio button

3.select 下拉式選單

4.利用 v-for 產生多個image(含後端產生Image路徑)

1.

single checkbox: checkbox  綁定的值預設的值是 true / false

multi checkbox :可以將值綁定在陣列裡面(checkboxArray)

<div id="app">
  <h4>single checkbox</h4>
  <div class="form-check">
   <input type="checkbox" class="form-check-input" id="check1" v-model="checkbox1">
   <label class="form-check-label" for="check1"> Single checkbox </label>
  </div>
	
  <h4>Multi checkbox</h4>
  <div class="form-check">
   <input type="checkbox" class="form-check-input" id="check2" value="雞" 
    v-model="checkboxArray">
   <label class="form-check-label" for="check2">雞</label>
  </div>
  <div class="form-check">
	<input type="checkbox" class="form-check-input" id="check3" value="豬" 
     v-model="checkboxArray">
	<label class="form-check-label" for="check3">豬</label>
  </div>
  <div class="form-check">
	<input type="checkbox" class="form-check-input" id="check4" value="牛" 
     v-model="checkboxArray">
	<label class="form-check-label" for="check4">牛</label>
  </div>
<p>晚餐火鍋裡有 <span v-for="item in checkboxArray">{{item}}</span>。</p>
</div>
<script>
	var app = new Vue({
		el: '#app',
		data: {			
			checkbox1: false,
			checkboxArray: []			
		},
	});
</script>

執行結果:

進階 multi checkbox

實務上,在GridView上面通常會有一個checkbox是可以全選/全不選,

例如:

可以參考的做法,就是把上面那一顆checkbox binding在一個變數,

然後在watch裡面去監控這個變數

watch: {   
	IsSelectAll: function () {
		let me = this;
		if (me.IsSelectAll === true) {
            // If Select All
			me.checkBoxArray = [];
			me.result.forEach(function (item) {
                //將所有的資料都push到 multi checkbox對應的Array
				me.checkBoxArray.push(item.Id);
			});
		}
		else {
            // Clear Array
			me.checkBoxArray = [];
		}
	}
},

2.radio button

如果要顯示的資料是陣列的話,value 要記得用 :value去綁定來源的value

<div id="app">
	<h4>Radio Button</h4>
	<div class="form-check" v-for="item in RadioResoutce">
		<input type="radio" class="form-check-input" :value=item.value v-model="singleRadio">
		<label class="form-check-label" for="radio2">{{item.text}}</label>
	</div>
	<p>晚餐火鍋裡有 {{singleRadio}}。</p>	
</div>
<script>
var app = new Vue({
	el: '#app',
	data: {			
		singleRadio: '',
		RadioResoutce: [{
			value: 'beef',
			text: '牛'
		}, {
			value: 'pork',
			text: '豬'
		}, {
			value: 'chicken',
			text: '雞'
		}]		
	},
});
</script>

執行結果:

3.select 下拉式選單

跟radion button 一樣 如果要顯示的資料是陣列的話,value 要記得用 :value去綁定來源的value

<div id="app">
	<h4>Select</h4>
    <select name="" id="" class="form-control" v-model="selected">
		<option value="" disabled>--請選擇--</option>
		<option v-for="item in seletResouce" v-bind:value=item.value>{{item.text}}</option>
	</select>	
</div>
<script>
var app = new Vue({
	el: '#app',
	data: {			
		selected: '',
		seletResouce: [{
			value: '1',
			text: '標題1'
		}, {
			value: '2',
			text: '標題2'
		}, {
			value: '3',
			text: '標題3'
		}],		
	}
});
</script>

小技巧:如果選項"請選擇"在使用者選完之後就不讓使用者重新選擇,可加上disabled 屬性

就會如下圖所示,選完標題一之後,請選擇就是disabled ,無法在選擇

4.利用 v-for 產生多個image

後端再產生image的路徑時,有幾點需要注意

Service的部分,

fileUploadPath 是圖片的檔案夾路徑,利用Path.Combine將路徑還有檔案名稱合併為一個完整的路徑

這裡有個地方需要注意,剛剛Service合併出來的是相對路徑,如下圖

但是在前端要使用的話,需要再Controller內使用Url.Content轉為絕對路徑,如下圖

整理好的物件再透過ViewBag傳到前端

前端,宣告一個物件接收ViewBag傳來的路徑資料

<script type="text/javascript">        
 var injectObj = {
  pictureInfo:JSON.parse('@Html.Raw(Json.Encode(ViewBag.PictureInfo))')
 }
</script>

Vue - Initial data

最後在HTML內使用v-for將路徑資訊binding給image

<button v-for="info in pictureInfo" class="icon-select">
  <img :src=info.ImagePath width="100%" height="100%" alt="" />
</button>