2012-02-13 11 views
17

Sử dụng loại trực tiếp, khi bạn gọi ko.applyBinding(viewModel, "divId") nó thực hiện một ràng buộc đệ quy xuống thông qua các con của phần tử bạn ràng buộc ("divId"). Tôi muốn dừng đánh giá này tại một nút con. Có cách nào để làm việc này không?Làm thế nào để ngăn chặn các ràng buộc knockout.js đánh giá trên các phần tử con

lý do tại sao ...

Tôi muốn để ràng buộc toàn bộ trang sang một mô hình giao diện điều hướng, điều này sẽ xử lý bố trí cơ bản và ... mỉm cười ... điều hướng. Trên các trang khác nhau, tôi muốn ràng buộc các vùng nhất định với các kiểu xem khác nhau không phải là thuộc tính của mô hình chế độ xem điều hướng. Tại thời điểm này nếu tôi làm điều này, tôi nhận được lỗi "không thể phân tích cú pháp ràng buộc" vì mô hình chế độ xem điều hướng không có các thuộc tính bắt buộc. Nếu tôi có thể ngăn chặn sự ràng buộc đi xuống dưới mái nhà, tôi có thể chỉ ràng buộc các mục này một cách riêng biệt.

Trả lời

35

Có một số cách mà bạn có thể đi vào thế này. Thông thường, bạn sẽ thêm nhiều mô hình xem "phụ" vào mô hình chế độ xem chính và sau đó sử dụng liên kết with trên các khu vực khác nhau với các mô hình chế độ xem thực tế để ràng buộc với chúng.

Có thể thực hiện kỹ thuật những gì bạn đang làm sau. Bạn có thể tạo một ràng buộc tùy chỉnh cho KO biết rằng nó sẽ xử lý ràng buộc chính các con. Nó sẽ trông giống như:

ko.bindingHandlers.stopBindings = { 
    init: function() { 
     return { controlsDescendantBindings: true }; 
    } 
}; 

Khi bạn đặt nó trên một phần tử, thì KO sẽ bỏ qua trẻ em. Sau đó, bạn có thể gọi ko.applyBindings trên một phần tử con của phần tử này với một mô hình khung nhìn khác.

mẫu: http://jsfiddle.net/rniemeyer/tWJxh/

thường tuy nhiên, bạn sẽ sử dụng nhiều mô hình xem bên dưới một mô hình giao diện chính bằng cách sử dụng with ràng buộc.

+1

Công cụ tuyệt vời, chính xác những gì tôi muốn. Kịch bản của tôi có thể không điển hình nhưng nó mang lại cho tôi phương pháp tiếp cận tải dựa trên mô-đun đúng nơi mỗi mô-đun độc lập với tất cả những người khác, làm cho việc kiểm tra ... –

+0

Điều này buộc sử dụng thêm một thùng chứa đơn giản để ngăn chặn các ràng buộc; Nó sẽ được dễ dàng để làm cho container-ít (bình luận) các nút hỗ trợ xử lý ràng buộc tùy chỉnh như stopBindings ở trên? Nó sẽ hữu ích trong các ứng dụng mô đun cao :) – AlexG

+0

Trong 2.1 (trong RC), các trình xử lý ràng buộc tùy chỉnh container-less sẽ có thể như: http://jsfiddle.net/rniemeyer/75yQD/. Vì vậy, nó sẽ không có vấn đề gì. Trong 2.0, 'ko.virtualElements.allowedBindings' không được hiển thị. –

3

Một cách tôi đã thực hiện việc này là tạo một phần cho điều hướng (hoặc chỉ a) và ràng buộc navVM với nó. Sau đó, tạo một phần khác cho nội dung và liên kết contentVM với nội dung đó. Bằng cách đó không có xung đột và tất cả đều bị tách rời.

<body> 
    <div id="navSection"> 
    </div> 
    <div id="contentSection"> 
    </div> 
</body> 

Sau đó làm ko.applyBinding (navVM, "navSection") và ko.applyBinding (contentVM, "contentSection")

+0

mmm ... đáng tiếc là không dễ dàng để tạo hai bối cảnh ràng buộc riêng biệt trong cùng một cây con –

+1

bạn "có thể" làm điều đó (xem ghi chú của Ryan), tôi chỉ nói rằng nó có thể có cấu trúc hơn để nghĩ về các thành phần của bạn như là các mô-đun lỏng lẻo của riêng chúng. –