1. 程式人生 > >Vue.js實現雙向資料繫結(表單自動賦值、表單自動取值)

Vue.js實現雙向資料繫結(表單自動賦值、表單自動取值)

1、使用Vue.js實現雙向表單資料繫結,例子

<!--html程式碼-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>財產查勘處理</title>
<link rel="stylesheet" type="text/css" href="../css/global.css" />
<link rel="stylesheet"
type="text/css" href="../css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="../css/AdminLTE.min.css" /> <link rel="stylesheet" type="text/css" href="../css/propertySurvey.css" /> </head> <body> <div class="container-fluid"> <div style="text-align: center; height:30px;background:#F4F9FD;padding:10px 0px;border-bottom:1px solid #000; font-weight: bold;"
>
請輸入物損檢視資訊</div> <h4 class="box-title"> <i class="glyphicon glyphicon-play-circle" style="color: #82C542;"></i> 報案資訊 </h4> <hr style="height: 3px; border: none; border-top: 3px solid #75C2D2;" /> <div class
="row text-center" style="margin-top: -23px; padding: 3px 50px; border-bottom: 1px solid #DBEEF1;">
<div style="width: 33%; float: left; text-align: left;"> <label>損失方</label><input v-model="RegistInfo_name" type="text" name="RegistInfo_name"/> </div> <div style="width: 33%; float: left; text-align: left;"> <label>聯絡人</label><input v-model="RegistInfo_user" type="text" name="RegistInfo_user"/> </div> <div style="width: 33%; float: right; text-align: left;"> <label>聯絡方式</label> <input v-model="RegistInfo_phone" name="RegistInfo_phone" type="text"/> </div> </div> <div class="row text-center" style="margin-top: -23px; padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="width: 33%; float: left; text-align: left;"> <label>損失方1</label><input v-model="Prplregist_name" type="text" name="Prplregist_name"/> </div> <div style="width: 33%; float: left; text-align: left;"> <label>聯絡人1</label><input v-model="Prplregist_user" type="text" name="Prplregist_user"/> </div> <div style="width: 33%; float: right; text-align: left;"> <label>聯絡方式1</label> <input v-model="Prplregist_phone" name="Prplregist_phone" type="text"/> </div> </div> <div class="row text-center" style="padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="width: 33%; float: left; text-align: left;"> <label>查勘估損金額</label> <input v-model="RegistInfo_chakan_money" name="RegistInfo_chakan_money" type="text" value="400.00" /> * </div> <div style="width: 33%; float: left; text-align: left;"> <label>施救費金額</label> <input v-model="RegistInfo_rescue_money" name="RegistInfo_rescue_money" type="text" name="" id="" value="0.00" /> </div> <div style="width: 33%; float: right; text-align: left;"> <label>需要施救</label> <input type="checkbox" />是否需要 </div> </div> <div class="row text-center" style="padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="width: 33%; float: left; text-align: left;"> <label>查勘估損金額1</label> <input v-model="Prplregist_chakan_money" name="Prplregist_chakan_money" type="text" value="400.00" /> * </div> <div style="width: 33%; float: left; text-align: left;"> <label>施救費金額1</label> <input v-model="Prplregist_rescue_money" name="Prplregist_rescue_money" type="text" name="" id="" value="0.00" /> </div> <div style="width: 33%; float: right; text-align: left;"> <label>需要施救1</label> <input type="checkbox" /><input type="checkbox" />沒錯<input type="checkbox" />必須 </div> </div> <div class="row text-center" style="padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="width: 67%; float: left; text-align: left;"> <label>查勘地點</label> <input v-model="address" name="address" type="text" style="width: 400px;" /> * </div> <div style="width: 33%; float: left; text-align: left;"> <label>查勘日期</label> <input v-model="RegistInfo_chakan_data" name="RegistInfo_chakan_data" type="text" name="" id="" value="2017-03-09" /> </div> </div> <div class="row text-center" style="padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="height: 50px; text-align: left;"> <label>施救過程描述</label> <input v-model="RegistInfo_say" name="RegistInfo_say" type="text" style="width: 900px; height: 50px;" /> </div> </div> <div class="row text-center" style="padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="height: 50px; text-align: left;"> <label>備註</label> <input v-model="remark" name="remark" type="text" style="width: 900px; height: 50px;" /> </div> </div> <div class="row text-center" style="padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="height: 50px; text-align: left;"> <select class="select2"> <option value="123" id="sel1">123</option> <option value="456" id="sel2">456</option> <option value="789" id="sel3">789</option> </select> </div> </div> <div class="row text-center" style="padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="height: 50px; text-align: left;"> <input type="radio" id="google" value="Google" v-model="RegistInfo_radio" name="RegistInfo_radio"> <label for="google">Google</label> <br> <input type="radio" id="runoob" value="Runoob" v-model="RegistInfo_radio" name="RegistInfo_radio"> <label for="runoob">Runoob</label> </div> </div> <div class="row text-center" style="padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="height: 50px; text-align: left;"> <input type="radio" id="helongjun" value="helongjun" v-model="RegistInfo_helongjun" name="RegistInfo_helongjun"> <label for="helongjun">helongjun</label> <br> <input type="radio" id="longjun" value="longjun" v-model="RegistInfo_helongjun" name="RegistInfo_helongjun"> <label for="longjun">longjun</label> </div> </div> <div class="row text-center" style="padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="height: 50px; text-align: left;"> <input type="radio" id="testOne" value="testOne" v-model="testOne" name="testOne"> <label for="helongjun">testOne</label> <br> <!--<input type="radio" id="testOne" value="testTwo" v-model="testOne" name="testOne"> <label for="longjun">testTwo</label>--> </div> </div> <div class="row text-center" style="padding: 3px 50px; border-bottom: 1px solid #DBEEF1;"> <div style="height: 50px; text-align: left;"> <select v-model="RegistInfo_selected" name="RegistInfo_selected"> <option value="">選擇一個網站</option> <option value="baidu">baidu</option> <option value="google">Google</option> </select> </div> </div> <div class="text-center row"> <button>暫存(S)</button> <button onclick="getInputVal()">返回(F)</button> </div> </div> <script type="text/javascript" src="../js/vue.min.js" ></script> <script type="text/javascript" src="../js/jquery-1.11.0.min.js"></script> <script type="text/javascript" src="../js/bootstrap.min.js"></script> <script type="text/javascript" src="../js/bootstrap-datetimepicker.min.js"></script> <script type="text/javascript" src="../VueFormSub.js" ></script>
#VueFormSub.js(實現雙向繫結主要程式碼)

//實現取值
var VueFormSub = function(formid){
    this.$form = ($("#" + formid).length !=0)?$("#" + formid):$("."+formid);
    var models = $("*[v-model != '']", this.$form);
    var vueData = {};
    $.each(models,function(idx,dom){
        var key = $(dom).attr("name");
        if (undefined != key){
            var dValue = $(dom).val();
            $(dom).val(dValue);
            var beanName = key.split("_");
            if(beanName.length < 2){
                vueData[beanName] = dValue;
                vueData[beanName] = $("input[type='radio'][name='"+key+"']:checked").val();
            }else{
                if(vueData[beanName[0]] == undefined){
                    vueData[beanName[0]] = {};
                }else{
                    if($(dom).attr("type") == "radio"){
                        var tempVal = $("input[type='radio'][name='"+key+"']:checked").val();
                        vueData[beanName[0]][beanName[1]] = tempVal;
                    }else{
                        vueData[beanName[0]][beanName[1]]=dValue;                       
                    }
                }
            }
        }
    });
    return vueData;
};

#初始化Vue表單資料(可以只傳入initDate資料來源,formid需要繫結的dom)
VueFormSub.initVue = function(initDate,formid,httpMethod, url, params){
    if(initDate instanceof Object){
        /*if(initDate.length !=0){}*/
        var initJson = VueFormSub.ObjConvert(initDate);
        new Vue({
            el : ($("#"+formid).length != 0)?'#'+formid:'.'+formid,
            data : initJson
        });
    }else{
        if (httpMethod != "get" && params && typeof (params) == "object"){
            params = JSON.stringify(params);
        }
        if(params!= null){
            params.rs = Math.random();
        }else{
            params = {'rs':Math.random()};
        }
        $.ajax({
            type: httpMethod,
            url: "/cxh" + url,
            data: params,
            cache:false,
            async: true,
            contentType: 'application/json',
            dataType: 'json',
            success: function (returnData) {
               if(returnData.length != 0){
                   var vueDate = VueFormSub.ObjConvert(returnData);
                   new Vue({
                       el:($("#"+formid).length != 0)?'#'+formid:'.'+formid,
                       data : vueDate
                   });
               }
            }
        });
    }
};

#對需要繫結的物件進行解析成Vue支援的格式
VueFormSub.ObjConvert = function(dataObj){
    var json = {};
    $.each(dataObj,function(id,param){
        if(param instanceof Object){
            $.each(param, function(rid,rparam){
                if(rparam instanceof Object){
                    json[id] = VueFormSub.ObjConvert(param);
                }else{
                    json[id+"_"+rid] = rparam;
                }
            });
        }else{
            json[id]=param;
        }
    });
    return json;
};
#使用例項
<script>
    #初始化資料data
    var initVue = {
        RegistInfo_name : 'legend',
        RegistInfo_user : '龍軍',
        RegistInfo_phone : '1008611',
        RegistInfo_chakan_money : '100',
        RegistInfo_rescue_money : '1000',
        address : '廣東省汕頭市潮南區',
        RegistInfo_chakan_data : '2017-5-7',
        RegistInfo_say : '這個只是測試用的',
        remark : '龍軍用來測試的',
        Prplregist_name : '林總',
        Prplregist_user : '林老闆',
        Prplregist_phone : '10010',
        Prplregist_chakan_money : '一萬塊',
        Prplregist_rescue_money : '一個億',
        RegistInfo_radio : "Runoob",
        RegistInfo_selected : "google",
        RegistInfo_helongjun : "helongjun",
        testOne:""
    };
    //初始化Vue表單
    VueFormSub.initVue(initVue,"container-fluid");
    //返回按鈕單擊
    function getInputVal(){
        //呼叫自動錶單封裝
        var resultVal = new VueFormSub("container-fluid");
        console.log(resultVal);
    }
#注意:input表單中的name屬性必須指定,最好和input表單中的v-model的值一樣
<script>

最終效果:
這裡寫圖片描述