MVVM架構~knockoutjs系列之驗證信息自定義(yi)輸出~再續
對于(yu)一個(ge)項目的表單(dan)驗證,方式(shi)有(you)很(hen)多,效果也有(you)很(hen)多,具(ju)體使(shi)用哪種完成(cheng)取(qu)決于(yu)產(chan)品(pin)這邊,產(chan)品(pin)讓你(ni)用什(shen)(shen)么,你(ni)就要用什(shen)(shen)么,而做為(wei)開發(fa)人員,我們要做的就是"整理(li)近可能(neng)多的架構方式(shi)",這樣才可以(yi)自由的應(ying)變(bian).
對于表(biao)單驗證,我今天看了新浪(lang)的郵(you)箱注冊,覺得(de)效果還可以(yi),所以(yi),就寫了一個,它利用了knockoutjs里的hasfocus屬性,對文本框進(jin)行焦點捕捉來實現的.
新浪截圖

說明(ming):表(biao)單元素為焦點時,自動提(ti)示要輸(shu)入的(de)信息(xi),當元素失去(qu)焦點時,提(ti)示用戶(hu)輸(shu)出的(de)正確性(xing),這個(ge)功能使(shi)用了hasfocus屬(shu)性(xing),下面看一下代碼
HTML代碼
<div class="editor-label"> 賬號(hao): </div> <div class="editor-field"> <input data-bind='value: name,validationElement:name,hasfocus:selName' /> <span class="validationWarn" data-bind="visible:selName">請輸入用戶名賬號,它由字母漢字數字組成.</span> <span data-bind="visible:!selName()"><span class="validationError" data-bind="validationMessage:name"></span></span> <span data-bind="visible:!selName()"><span class="validationSuccess" data-bind="visible:name.isValid()"></span></span> </div> <div class="editor-label"> Email: </div> <div class="editor-field"> <input data-bind='value: Email,hasfocus:selEmail' /> <span data-bind="visible:!selEmail()"><span class="validationError" data-bind="validationMessage:Email"></span></span> <span class="validationWarn" data-bind="visible:selEmail">請輸入你的Email.</span> <span data-bind="visible:!selEmail()"><span class="validationSuccess" data-bind="visible:Email.isValid()"></span></span> </div> <div class="editor-label"> 手機: </div> <div class="editor-field"> <input data-bind='value: phone,hasfocus:selPhone' /> <span data-bind="visible:!selPhone()"><span class="validationError" data-bind="validationMessage:phone"></span></span> <span class="validationWarn" data-bind="visible:selPhone">請輸入你的電話.</span> <span data-bind="visible:!selPhone()"><span class="validationSuccess" data-bind="visible:phone.isValid()"></span></span> </div> <div style="clear: both;"></div> <p> <input type="button" value="Create" data-bind="click:Register" /> </p>
JS代碼
var Product = function () { var self = this; ko.validation.configure({//ko.validation相關(guan)配置 insertMessages: false,//不自動插入錯誤消(xiao)息 errorElementClass: 'errorElementClass',/*元素(su)的CSS樣(yang)式(shi)*/ errorMessageClass: 'errorMessageClass',/*提(ti)示信(xin)息CSS的樣式*/ }); self.name = ko.observable().extend({ minLength: 2, maxLength: { params: 30, message: "名稱最大長度為30個字符" }, required: { params: true, message: "請輸入名稱", } }); self.selName = ko.observable(false); self.phone = ko.observable().extend({ required: true, number: { params: true, message: "電話不合法", } }); self.selPhone = ko.observable(false); self.Email = ko.observable().extend({ required: { params: true, message: "請填寫Email" }, email: { params: true, message: "Email格式不正確" } }); self.selEmail = ko.observable(false); self.Register = function () { self.errors = ko.validation.group(self); if (self.isValid()) { alert("驗證成功,數據可以提交"); } else { self.errors.showAllMessages(); } }; }; product = new Product(); ko.applyBindings(product);
頁面截圖
