2013-06-26 36 views
7

Tôi đang sử dụng Durandal, do đó tận dụng hết Knockout.Xác nhận loại bỏ: Hạn chế động

Tôi muốn để có thể Thay đổi xác nhận độ dài động

enter image description here

Fiddle

Các fiddle dường như được cư xử hơi khác so với tôi giải pháp "làm việc", nhưng nó vẫn không làm những gì tôi muốn/mong đợi nó.

ViewModel JS:

[Cố gắng 1]

define(function() { 

    var self = this; 

    self.userInfo = {  
     IdOrPassportNumber: ko.observable().extend({ 
      required: true, 
      pattern: { 
       message: 'A message', 
       params: /some regex/ 
      } 
     }), 
     IdType: ko.observable() 
    }, 

    self.isIdValid = ko.validatedObservable({ 
     IdOrPassportNumber: self.userInfo.IdOrPassportNumber 
    }); 

    self.userInfo.IdOrPassportNumber.subscribe(function (value) { 
      if (isIdValid.isValid()) { 
       console.log('YOLO!'); 
      } 
    }); 

    self.userInfo.IdType.subscribe(function (value) { 
     console.log(value); 
     if (value === 'Passport') { 
      self.userInfo.IdOrPassportNumber.extend({ maxLength: 15 }); 
     } else { 
      self.userInfo.IdOrPassportNumber.extend({ maxLength: 13 }); 
     } 
    });  

    var viewModel = { 
     userInfo: self.userInfo 
    }; 

    viewModel["errors"] = ko.validation.group(viewModel.userInfo); 
    viewModel["errors"].showAllMessages(); 

    return viewModel; 
}); 

gì dường như xảy ra là khi tôi bắt đầu gõ tôi nhận được tối đa & xác phút 13, nhưng nếu tôi tiếp tục gõ các thay đổi xác nhận 15. Tôi đã thử một tuyến đường khác, thiết lập chiều dài tối thiểu & tối đa trong vòng mở rộng EG có thể quan sát được, ngay sau regex, và sau đó thiết lập độ dài tối thiểu và tối đa để sử dụng một quan sát, không sự thành công.

[Cố gắng 2]

self.userInfo = {  
     IdOrPassportNumber: ko.observable().extend({    
      maxLength: self.maxLength(), 
      minlength: self.maxLength() 
     }), 
     IdType: ko.observable() 
    }, 

    self.maxLength = ko.observable(); 

    self.userInfo.IdType.subscribe(function (value) { 

      if (value === 'Passport') { 
      self.maxLength(15) 
      } else { 
       self.maxLength(3) 
      } 
    }); 
+2

bạn có thể sử dụng để http://cdnjs.com/ lấy plugin xác nhận loại trực tiếp ... – nemesv

+1

Xong. +1 Ps trang web rất tuyệt. Được đánh dấu là chắc chắn :) –

Trả lời

3

Bạn đã rất gần :-) Bạn phải cung cấp chính bản thân quan sát được chứ không phải giá trị chưa được mở. Vì vậy, chỉ cần xóa () từ maxLength() - thư viện xác nhận sẽ tự động mở nó cho bạn.

self.userInfo = {  
    IdOrPassportNumber: ko.observable().extend({    
     maxLength: self.maxLength, 
     minlength: self.maxLength 
    }), 
    IdType: ko.observable() 
}, 

Đây là một ví dụ khác có mẫu regex động.

zipPostalPattern = ko.pureComputed(() => this.countryCode() === 'US' ? '^\\d{5}(?:[-\\s]\\d{4})?$' : ''); 
    zipOrPostal: KnockoutObservable<string> = ko.observable('').extend(
    { 
     required: true, 
     pattern: { 
      message: 'This is not a valid postcode for the country', 
      params: this.zipPostalPattern 
     } 
    }); 

hoặc (nếu bạn không muốn nhận thư).

zipPostalPattern = ko.pureComputed(function() { return this.countryCode() === 'US' ? '^\\d{5}(?:[-\\s]\\d{4})?$' : ''}); 
    zipOrPostal: KnockoutObservable<string> = ko.observable('').extend(
    { 
     required: true, 
     pattern: self.zipPostalPattern 
    }); 

quan trọng: Nếu bạn không muốn có một thông báo tùy chỉnh không chỉ loại bỏ các tham số message và rời pattern = { params: this.zipPostalPattern } bởi vì nó sẽ không làm việc. Nếu bạn không có thông báo, bạn phải đặt trực tiếp Regex/string cho tham số pattern.

Hoặc tất nhiên bạn chỉ có thể xác định các quan sát được tính tại chỗ (ở đây nó là ok để gọi countryCode() như một chức năng vì đó là cách tính của công việc)

zipOrPostal: KnockoutObservable<string> = ko.observable('').extend(
    { 
     required: true, 
     pattern: ko.pureComputed(function() { 
        return self.countryCode() === 'US' ? '^\\d{5}(?:[-\\s]\\d{4})?$' : '' 
        }) 
    }); 
+2

Đối với bất kỳ ai khác đọc nội dung này. Tôi không thể kiểm tra điều này đối với tình huống chính xác mà tôi đã có lúc này ở giai đoạn đó, (không còn trong dự án này nữa). Tôi thích giải pháp của @ Simon_Weaver như là giải pháp được chấp nhận, và sẽ đánh dấu nó như vậy. –

+1

Cảm ơn. Tôi phải nói rằng nó chỉ xảy ra với tôi ngày hôm nay rằng tôi có thể truyền đạt một quan sát như một tham số cho một quy tắc, và tôi rất phấn khởi - sau đó nhận ra có lẽ nó không hoạt động - nhưng tôi lại hào hứng làm việc rất tốt :-) Từ những gì tôi nhớ nó không phải là tài liệu rõ ràng, nhưng nó rất dễ dàng nếu bạn đã biết làm thế nào để sử dụng Knockout và thêm một số tính linh hoạt tuyệt vời. –

6

Dưới đây là giải pháp mà làm việc cho tôi:

Tôi đã sử dụng các tính năng custom validation, cụ thể hơn là single use custom validation như thế này sẽ không được tái sử dụng ở nơi khác.

[Nỗ lực 3]

self.userInfo = {  
     IdOrPassportNumber: ko.observable().extend({ 
      required: true, 
      pattern: { 
       message: 'A message', 
       params: /some regex/ 
      }, 
      validation: { 
       validator: function (val) { 
        if (self.userInfo.IdType() === 'Id') { 
         return val.length === 13; 
        } else { 
         return val.length === 15; 
        } 
       }, 
       message: function() { 
        if (self.userInfo.IdType() === 'Id') { 
        return 'Required: 13 characters'; 
        } else { 
        return 'Required: 15 characters'; 
        } 
       } 
      } 
     }) 
    } 
+3

Là một lưu ý phụ. Tôi nhận thấy rằng thứ tự của các xác nhận hợp lệ cũng quan trọng, vì vậy hãy nói rằng bạn muốn trình xác thực tùy chỉnh của bạn (hoặc bất kỳ thứ gì khác) cho vấn đề đó kích hoạt trước tiên, đặt chúng theo đó –

+0

Không tốt hơn nếu sử dụng hai trường khác nhau với xác thực cố định và thay đổi ràng buộc trên trang ''? Khi lưu chỉ cần viết 'var idOrPassword = id() || password()'. – blazkovicz

4

xem xét việc này

self.iDNumber = ko.observable('').extend({ 
     required: { 
      params: true, 
      message: 'ID Number is a required field.', 
      insertMessages: false 
     }, 
     SouthAfricanIDNumber: { 
      message: 'Please enter a valid South African ID number.', 
      onlyIf: function() { 
       return self.identityType() === 'SAID'; 
      } 
     } 
    }); 

nơi SouthAfricanIDNumber là một xác nhận tùy chỉnh mà sử dụng regex.

+1

chào mừng bạn đến với SO :), nhưng hãy xem câu trả lời được chấp nhận của tôi. (Tôi không còn tham gia dự án nữa. nhưng tôi sẽ ghi nhớ trong tương lai) –

+1

+1 để khuyến khích 'spacerogue' với bài đăng đầu tiên của anh ấy. – hirikarate

Các vấn đề liên quan