文章出處

返回目錄

對于Knockoutjs本身來說,沒有提供驗證模塊,不過,有第三方的擴展,就像你為jquery庫作extensions一樣,這講中我將介紹一個Knockout插件擴展,knockout.validation.js,用它來實現對HTML標記的驗證,

下面是它在Github上的地址https://github.com/Knockout-Contrib/Knockout-Validation。這個插件的使用很類似MVC自己的驗證,如果你自己手動擴展過它的ValidationAttribute,那么你對下面的JS肯定不會

感到陌生,思想是一樣的,JS里的Validation也是面向對象的,也支持override,比如系統為非空驗證提供的提供是“This field is required.”,你當然可以重寫它,讓它顯示“請輸入用戶名”,呵呵,這個很簡單,下面

看一下某體的代碼:

首先要引入這兩個JS文件

  <script src="~/Scripts/knockout-2.1.0.js"></script>
  <script src="~/Scripts/knockout.validation.min.js"></script>

下面的例子中,分別對用戶名,分類ID,價格,Email地址做了數據有效性的驗證,并且每個驗證中的參數都可以以JS對象或者屬性的形式存在,這也足夠靈活了,如果是JS對象的話,那么params表示參數的值,而message

表示提示的信息,看一下它的實現(很面向對象的,呵呵)。

<script type="text/ecmascript">
    var Product = function () {
        var self = this;

        self.CategoryId = ko.observable().extend({
            required: true
        });

        self.price = ko.observable().extend({
            required: { params: true, message: "請輸入價格" },
            min: { params: 1, message: "請輸入大于1的整數" },
            max: 100
        });

        self.name = ko.observable().extend({
            minLength: 2,
            maxLength: { params: 30, message: "名稱最大長度為30個字符" },
            required: {
                params: true,
                message: "請輸入名稱",
            }
        });

        self.Email = ko.observable().extend({
            required: {
                params: true,
                message: "Please enter your email"
            },
            email: {
                params: true,
                message: "The format is not correct"
            }
        });



        self.Register = function () {
            self.errors = ko.validation.group(self);
            if (self.isValid()) {
                alert('data sent');
            } else {
                self.errors.showAllMessages();
            }
        };



    }
    var viewModel = new Product();
    ko.applyBindings(viewModel);

</script>

下面再看一下HTML部分,它與之前講的knockout數據綁定沒有區別

<fieldset>
        <legend>添加商品</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.name)
        </div>
        <div class="editor-field">
            <input data-bind='value: name' />
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.price)
        </div>
        <div class="editor-field">
            <input data-bind='value: price' /><!-- uniqueName: true表示表單的name是唯一的-->
            <div class="editor-label">
                @Html.LabelFor(model => model.CategoryId)
            </div>
        </div>
        <div class="editor-field">
            <input data-bind='value: CategoryId' />
        </div>
        <p>
            <input type="button" value="Create" data-bind="click:Register" />
        </p>
    </fieldset>

事實上,比上面的知識更重要的是,我認為還是它的思想,這樣東西都可以由前臺工程師去開發,然底層開發人員(asp,.net,php,jsp,ios,android)不需要去干預這些,它們只要寫好JS文件去調用自己的方法即可,當然JS文件也可以以前臺工程師去寫,只不

過,這需要前臺工程師等底層工程師把接口寫好后,再開發了,呵呵。

看一下效果:

怎么樣,有點MVC的味道吧,呵呵,這個前臺validation的表現可以由CSS工程師去搞定,不過,一般這活都是前臺工程師的,嗨,前臺工程師要負責的東西可真不少PS切圖,HTML代碼編寫,JS代碼編寫,CSS樣式編寫,還有如果是MVVM架構,

他們還要了解數據庫結構,呵,在這里,讓我代表所有開發人員說一聲:“前臺工程師,你們辛苦了”!

 返回目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()