2012-12-03 46 views
19

Tôi đang sử dụng MVC, Knockout và Xác nhận Knockout để xác thực mô hình chế độ xem của tôi.Xác nhận Knockout đánh giá ngay lập tức khi tải

Tôi đang gặp sự cố trong đó xác thực cho thuộc tính mô hình chế độ xem đang kích hoạt ngay khi tải. Nói cách khác, "Trường này là bắt buộc" hiển thị bên cạnh các yếu tố đầu vào của tôi trước khi người dùng cố gắng thay đổi giá trị của chúng.

Sự cố này xảy ra cụ thể với các điều khiển thả xuống (chọn).

Tôi đoán rằng đây là sự cố mà tôi đã tạo bằng cách nào đó vô tình thay đổi/truy cập/biến đổi có thể quan sát được trong một phần khác của mã javascript của tôi. Tuy nhiên, tôi không biết làm thế nào để theo dõi này xuống.

Có cách nào để bằng cách nào đó tôi có thể đăng ký hoặc theo dõi ngay cả các vụ cháy gây ra xác thực trong Xác nhận Knockout không? Tôi chỉ cần biết tại sao điều này lại bùng nổ theo cách của nó. Tôi khá tự tin rằng giá trị của hàm isValid() là luôn sai.

Dưới đây là một ví dụ về cách HTML của tôi là thiết lập trên tải trang, unmolested:

<select class="highlightable validationElement" name="obsstate" data-bind="value: standardAnswers.ans106_1.value" required="true"> 
    <option value="">-- Select -- </option> 
     <option value="AK">AK</option> 
     <option value="AL">AL</option> 
     etc... 

</select> 

As displayed on my local machine

Trả lời

7

tôi đã tìm ra vấn đề này một mình.

Sự cố tồn tại giữa công cụ dao cạo tạo khuôn mẫu cho các tùy chọn đã chọn và sau đó gắn kết giá trị của phần tử đã chọn vào Knockout.

Mặc dù thực tế không có giá trị do người dùng nhập vào hộp chọn, giá trị mặc định, "--select--" thực sự chứa một giá trị. Trong trường hợp của tôi nó là một chuỗi rỗng. Vì vậy, khi tôi áp dụng các ràng buộc loại trực tiếp, thuộc tính viewmodel của tôi đã được "cập nhật" với giá trị chuỗi rỗng, và do đó xác nhận được kích hoạt.

Để giải quyết vấn đề này trong trường hợp của tôi, tôi đặt giá trị mặc định của mô hình là chuỗi rỗng. Do đó khi các ràng buộc được áp dụng, không có sự kiện valueHasMutated được kích hoạt trên Knockout, và do đó không có sự xác nhận hợp lệ.

+0

tôi đặt mô hình để chuỗi rỗng nhưng nó vẫn bắn vào tải. Một trong những điều tôi nhận thấy là tùy chọnCaptions: 'Chọn ...'không đưa vào mục, nhưng giá trị không phải là giá trị = "" giá trị tùy chọn chỉ > Chọn ... – jmogera

+0

Người trả lời tốt !! Đã làm cho tôi. –

9

Trích dẫn trang KO .... (http://knockoutjs.com/documentation/options-binding.html)

KO sẽ tiền tố danh sách các mục có một hiển thị dòng chữ “Chọn một mục ...” và có giá trị không xác định. Vì vậy, nếu myChosenValue giữ giá trị không xác định (mà các quan sát được thực hiện theo mặc định), thì tùy chọn giả sẽ được chọn. Nếu tham số optionsCaption là một quan sát, thì văn bản của mục ban đầu sẽ cập nhật khi giá trị của các quan sát thay đổi.

Vì vậy, tôi giải quyết nó bằng cách thiết lập "không xác định" khi xác định tài sản, xem ví dụ dưới đây:

self.myProperty = ko.observable(undefined).extend({ 
    required : {"Field Required"} 
}); 

Hope this helps ...

20

Sau khi áp dụng các ràng buộc cho viewmodel. Sau đó cho viewmodel mà làm showAllMessages như false

Ví dụ

YourViewmodelname.errors.showAllMessages(false); 
+5

Cú pháp khác biệt rất hữu ích trong trường hợp của tôi: 'ko.validation.group (viewModel()). ShowAllMessages (false);' –

+0

@JonathanStrate Cảm ơn bạn đã đăng bài - Trong trường hợp viewmodel.errors của tôi không được xác định và phiên bản của bạn đã hoạt động . – Peanut

+0

Sau khi ko.applyBindings (...), nhóm các lỗi và gọi phương thức: ko.validation.group (yourViewModel, {deep: true}). ShowAllMessages (false); – goamn

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