2011-09-14 34 views
10

Bài viết này của Sencha bao gồm cách sử dụng quy tắc xác thực được xây dựng (hiện diện, độ dài, định dạng, bao gồm, loại trừ) và đề cập rằng việc thêm quy tắc tùy chỉnh là dễ dàng, nhưng không bao giờ giải thích làm thế nào để làm điều đó. Tôi đã googled cao và thấp và đọc tài liệu sencha, nhưng tôi không thể tìm thấy bất cứ điều gì về làm thế nào để làm điều đó. Bất kỳ ý tưởng?Cách thêm quy tắc xác thực tùy chỉnh vào mô hình trong Sencha Touch

http://www.sencha.com/learn/using-validations-and-associations-in-sencha-touch

Trả lời

8

Tôi nghĩ đây là một trong những lỗi nhỏ trong tài liệu. Tôi yêu cầu họ làm việc bằng cách thêm một số mã

if (Ext.data) { 
    Ext.data.validations.custom = function (config, value) { 
     if (config && Ext.isFunction(config.fn)) { 
      //this should be the model 
      if (config.self) { 
       return config.fn.call(config.self, value); 
      } else { 
       return config.fn(value); 
      } 
     } 
     else 
     { 
      return false; 
     } 
    }; 
    Ext.data.validations.customMessage = "Error"; 
} 

Sau đó, để thêm xác thực vào mô hình, thêm đối tượng vào mảng xác thực của mô hình với loại được đặt thành 'tùy chỉnh', ví dụ:

{ 
    type: 'custom', field: 'SomeField', message: "Your field is bad", 
    fn: function (SomeFieldValueForThisInstance) { 
     //Add some validation code. The this pointer is set to the model object 
     //so you can call this.get("SomeOtherFieldToCheck") 
     //or any other instance method 

     //if the field is good 
     return true; 
     //else 
     return false; 
    } 
} 

Cập nhật: @salgiza đã đúng, có một vài bước tôi quên đề cập đến để thiết lập 'này' con trỏ một cách chính xác. Nếu bạn nhìn vào các mã liên lạc sencha bạn sẽ thấy rằng vào cuối constructor Ext.data.Model của nó sẽ kiểm tra xem nếu có một hàm init xác định trên đối tượng, và nếu như vậy, gọi nó là

 if (typeof this.init == 'function') { 
      this.init(); 

Sau khi bạn xác định mô hình của mình, bạn có thể thêm hàm init vào nguyên mẫu. Trong hàm, lặp qua các xác nhận hợp lệ cho đối tượng và thêm một tham chiếu đến điều này. Bước này nên được thực hiện trước khi bất kỳ mô hình nào được tạo.

YourModel.prototype.init = function() { 
     var i, len; 
     if (this.validations) { 
      for (i = 0, len = this.validations.length; i < len; i++) { 
       this.validations[i].self = this; 
      } 
     } 
    }; 

Sau đó, trong chức năng xác thực tùy chỉnh ở trên, chỉ cần kiểm tra xem cấu hình có tự trỏ và nếu có, hãy tự gọi nó. Tôi đã chỉnh sửa mã ở trên để sử dụng bản thân.

Lưu ý: Tôi không thấy hàm init của tài liệu được mô tả, vì vậy nếu sencha loại bỏ nó, bạn sẽ phải thêm con trỏ này vào các xác thực của mô hình theo một cách khác.

Xin lỗi nếu điều này gây nhầm lẫn cho bất kỳ ai.

+0

Tôi không biết nếu nó được thay đổi kể từ khi bạn đăng câu trả lời của bạn, nhưng trong Sencha 1.1.1 phạm vi xác nhận là đối tượng xác nhận, do đó, dường như không có cách nào để có được các giá trị khác trong mô hình, ngoại trừ một trong những đang được xác nhận (this.get không có gì, vì "này" không phải là mô hình). – salgiza

+0

1) Bạn có quá nhiều nhánh khác. 2) YourModel.prototype.init' đi đâu? Điều này không có ý nghĩa. –

+1

@SarahVessels 1. Bạn nói đúng. Tôi đã bỏ lỡ một} cho khối thứ hai khác. Xin lỗi vì điều đó. 2. YourModel.prototype.init có thể đi bất cứ nơi nào miễn là bạn thực hiện nó sau khi bạn đã khai báo mô hình của bạn.Tôi sử dụng RequireJS để quản lý các phụ thuộc của tôi vì vậy tôi bao gồm các mô-đun đó thêm vào nguyên mẫu sau khi tôi đã bao gồm các mô hình của tôi. –

2

Tôi đã hơi chuyển mã từ Jason cho sencha touch 2 (kể từ khi kiểm chứng thực hiện đang trong sở hữu cấu hình của mô hình). Tôi khuyên bạn nên tạo một lớp cơ sở mà từ đó tất cả các lớp mô hình khác của bạn sẽ kế thừa. Sau đó, khi bạn đã thực hiện điều đó, bạn có thể sử dụng kỹ thuật của jason để thêm các xác nhận hợp lệ tùy chỉnh trong Ext.data.validations singleton.

Ext.define('MyApp.model.CustomModelBase', { 
    extend: 'Ext.data.Model', 

    //adding an initializer to let custom validators access "self" 
    init : function() { 
     var i, len; 
     if (this.config.validations) { 
      for (i = 0, len = this.config.validations.length; i < len; i++) { 
       this.config.validations[i].self = this; 
      } 
     } 
    } 
}); 
2

tôi nghĩ cách dễ nhất để thêm xác thực tùy chỉnh phức tạp vào mô hình của bạn là ghi đè phương thức xác thực. xem dưới đây, do cuộc gọi cha mẹ, nó hỗ trợ các loại xác nhận nội trang.

validate: function() { 
    var me = this; 
    var errors = this.callParent(arguments); 

    /* custom complex validations here */ 
    if(true !== me.get('checkOne') && 
     true !== me.get('checkTwo') && 
     true !== me.get('checkThree')) { 
     errors.add(Ext.create('Ext.data.Error', { 
        field : 'checkOne', 
        message: 'Choose at least one check, e.g. checkOne' 
       })); 
    } 

    return errors; 
} 
Các vấn đề liên quan