2013-01-04 42 views
24

gì là "thực hành tốt nhất" cách gợi ý để sử dụng Knockout của "attr" dữ liệu ràng buộc với các thuộc tính độc lập như "readonly""tàn tật"?Knockout attr ràng buộc với các thuộc tính như 'readonly' và 'khuyết tật'

Những thuộc tính này là đặc biệt ở chỗ chúng thường được kích hoạt bằng cách thiết lập giá trị thuộc tính với tên thuộc tính (mặc dù nhiều trình duyệt hoạt động tốt nếu bạn chỉ đơn giản bao gồm các tên thuộc tính mà không cần bất kỳ giá trị trong HTML):

<input type="text" readonly="readonly" disabled="disabled" value="foo" /> 

Tuy nhiên, nếu bạn không muốn những thuộc tính này được áp dụng, việc thực hành nói chung là chỉ cần bỏ qua chúng hoàn toàn từ HTML (như trái ngược với làm một cái gì đó giống như readonly = "false"):

<input type="text" value="foo" /> 

Ràng buộc dữ liệu "attr" của Knockout không hỗ trợ trường hợp này. Ngay sau khi tôi cung cấp tên thuộc tính, tôi cũng cần phải cung cấp một giá trị:

<input type="text" data-bind="attr: { 'disabled': getDisabledState() }" /> 

Có cách nào để tắt trình duyệt chéo 'bị tắt' hoặc 'chỉ đọc'? Hoặc là có một thủ thuật với ràng buộc tùy chỉnh mà tôi có thể sử dụng để không hiển thị bất cứ điều gì nếu tôi không muốn mục bị vô hiệu hóa hoặc chỉ đọc?

+0

Tôi không hiểu, tại sao bạn cần phải cung cấp cho người khuyết tật nếu bạn không vô hiệu hóa để thậm chí hiển thị? – jjperezaguinaga

+0

Ví dụ tôi đưa ra được thiết kế để chỉ đơn giản là chứng minh vấn đề. Vấn đề là: một số thuộc tính trong HTML là các thuộc tính độc lập - chúng không thực sự đòi hỏi một giá trị. Và nếu bạn không muốn các thuộc tính này ảnh hưởng đến HTML, thì bạn chỉ cần bỏ qua chúng. Nhưng cơ chế ràng buộc dữ liệu "attr" của Knockout không hỗ trợ kịch bản này. –

Trả lời

35

Ràng buộc dữ liệu "attr" của Knockout hỗ trợ kịch bản này chỉ trả lại null hoặc undefined từ chức năng getDisabledState() của bạn sau đó nó sẽ không phát ra thuộc tính.

Demo Fiddle.

+0

Làm cách nào để xác minh rằng thuộc tính chưa được phát ra bằng Firebug hoặc một công cụ tương tự? Khi tôi cố gắng xem HTML "trực tiếp" từ Fiddle demo ở trên, tôi vẫn thấy mã ràng buộc dữ liệu Knockout, không phải thẻ trực tiếp, được trả về . (Tuy nhiên, tôi sẽ thừa nhận rằng nó không bao giờ xảy ra với tôi để làm điều này, trong hàm getDisabledState() của tôi, tôi đã luôn luôn trở về hoặc là "vô hiệu hoá" hoặc chuỗi rỗng ""). –

+0

Nếu fiddle của tôi làm việc với trình duyệt của bạn thì nó đang hoạt động. Tôi không sử dụng Firebug. Trong các công cụ của Chrome dev, rõ ràng là nó thêm và loại bỏ thuộc tính nếu bạn trả về '" bị tắt "' và 'undefined'. – nemesv

+0

OK. Tôi đã xác minh điều này bằng Chrome. Cảm ơn bạn đã phản hồi nhanh và Fiddle demo.Đó là một giải pháp đơn giản và thanh lịch chưa bao giờ xảy ra với tôi. Tôi thường khởi tạo các giá trị trả về của tôi cho kiểu dữ liệu dự kiến ​​(cho kiểu 'disabled' hoặc 'readonly' là một chuỗi). Tôi sẽ chỉ khởi tạo 'không xác định' và tôi nên tốt để đi. Cảm ơn! –

7

Knockout có gắn kết enable cũng như ràng buộc disable.

Tôi không chắc chắn nếu các tính năng này có sẵn khi câu hỏi được hỏi, nhưng bất kỳ ai đề cập đến vấn đề này nên lưu ý.

+1

Hãy chắc chắn chọn đúng. '! observableProperty' không hoạt động. NOT '!' Không được đánh giá bởi người đánh giá. –

+4

! ObservableProperty() hoạt động mặc dù :) nhanh hơn nhiều và thường sạch hơn so với một ràng buộc tùy chỉnh – mikus

+1

@ P.Brian.Mackey Đó là một sai lầm mới bắt đầu Knockout phổ biến. Khi bạn thêm một toán tử như thế! ở phía trước của mộtProperty quan sát, bạn cần phải gọi nó một cách rõ ràng bằng cách thêm() vào cuối propertyName. Điều này cho Knockout nâng toàn bộ biểu thức lên một tính tổng hợp. Nếu bạn sử dụng Trình gỡ lỗi Chrome và nhập vào một tệp không thể tồn tại observableProperty không tồn tại, nó sẽ tạo ra lỗi với VM: SomeLineNumber trong Bảng điều khiển. Nhấp vào VM: SomeLineNumber và bạn sẽ thấy những gì Knockout được tạo ra. –

9

Bạn cũng có thể tạo ra một ràng buộc cho readonly như thế này:

ko.bindingHandlers['readonly'] = { 
'update': function (element, valueAccessor) { 
    var value = ko.utils.unwrapObservable(valueAccessor()); 
    if (!value && element.readOnly) 
     element.readOnly = false; 
    else if (value && !element.readOnly) 
     element.readOnly = true; 
} 
}; 

Nguồn: https://github.com/knockout/knockout/issues/1100

+0

Cảm ơn bạn đã chia sẻ nguồn và bao gồm mã nội tuyến. –

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