2014-04-24 17 views
5

Tôi hiện đang xây dựng một số ứng dụng nặng trong Knockout. Trong ứng dụng của tôi có ba loại số: tỷ lệ phần trăm, số thập phân và số lượng lớn và tôi có trình xử lý ràng buộc tùy chỉnh cho từng loại.Knockout chia sẻ một handler ràng buộc

Đối với các yếu tố đầu vào, tôi cũng đã tạo một ràng buộc xác thực sốHandler đọc từng phím nhấn để đảm bảo rằng đó là số được nhập. (trong ứng dụng có các hình động và hình ảnh CSS biên giới hào nhoáng - đây chỉ là một mẩu xương trần bị tước bỏ ví dụ).

Bây giờ để có các đầu vào thực hiện kiểm tra xác thực và định dạng số, tôi đã phải liên kết biến hai lần như bạn sẽ thấy đúng trong phần dưới đây.

<input data-bind="number: testdata, percentage: testdata"> 

Tôi nghĩ rằng điều này là không cần thiết phải tăng cường đánh dấu HTML của mình và phải có một cách gọn gàng hơn để kích hoạt cả hai trình xử lý cùng một lúc.

Câu hỏi của tôi: Có thể tạo ra các kịch bản xác nhận số là một hàm mà sau đó có thể được chia sẻ/bao gồm bên trong định dạng số xử lý; mà không bloating Javascript của tôi?

Tôi vẫn là một người mới ở Knockout nên tôi vẫn không chắc chắn về ranh giới của nó.

Xem Fiddle: http://jsfiddle.net/axV6S/1/

Trả lời

2

Vâng, bạn chỉ có thể trích xuất ra các init số vào chức năng riêng của nó, tức là thay đổi điều này:

ko.bindingHandlers.number = { 
    init: function (element) { 
     /* ... */ 
    } 
}; 

vào đây:

var numberInit = function(element) { 
    /* ... */ 
}; 

Chỉ cần gọi nó từ init khác của bạn như thế này:

init: function(element, valueAccessor) { 
    numberInit(element); 
    /* ... */ 
} 

hoặc nếu bạn muốn giữ đúng bối cảnh 'này':

init: function(element, valueAccessor) { 
    numberInit.apply(this,arguments); 
    /* ... */ 
} 
0

Bạn đang sao chép rất nhiều trong xây dựng chức năng trong vòng knock-out. Khi tạo viewmodel của bạn, bạn có thể xác định các hạn chế cho các thuộc tính mô hình của bạn. Bạn có thể thực hiện việc này cho rất nhiều dữ liệu số của mình:

this.FieldName = ko.observable().extend({ pattern: regex }); 

Điều này sẽ hạn chế trường văn bản của bạn, bạn không cần phải nghe nhấn phím và thực hiện hành động. Knockout thực hiện điều này trong nền cho bạn!

Có xem xét này để biết thêm ví dụ: http://mikedormitorio.azurewebsites.net/BlogPost/the-native-validation-rules-of-knockout-validation

Đây cũng là một đọc hữu ích: http://knockoutjs.com/documentation/extenders.html

+1

Xin lưu ý rằng điều này phụ thuộc vào [Knockout-Validation] (https://github.com/Knockout -Contrib/Knockout-Validation), là một thư viện bên ngoài và không phải là một phần của Knockout Core. – janfoeh

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