Hãy nói rằng chúng tôi có dữ liệu như sauProgressive Enhancement với KnockoutJS
var data = {
facets: [{
name : "some name",
values: [{
value: "some value"
}]
}]
};
Chúng ta có thể dễ dàng thể hiện điều này như một mô hình điểm ràng buộc với một mẫu loại trực tiếp như sau:
<ul data-bind="foreach: facets">
<li>
<span data-bind="text: name"></span>
<ul data-bind="foreach: values">
<li data-bind="text: value"></li>
</ul>
</li>
</ul>
Câu hỏi đặt ra là, làm thế nào chúng ta có thể đạt được kết quả tương tự khi sử dụng nâng cao tiến bộ không? Đó là do có mẫu render trên phía máy chủ ban đầu và sau đó ràng buộc mẫu knockout và mô hình khung nhìn để render.
Một đơn giản mẫu phía máy chủ sẽ giống như thế này:
<ul>
<li>
<span>some name</span>
<ul>
<li>some value</li>
</ul>
</li>
</ul>
Tôi đã khám phá một vài khả năng khác nhau:
Một là tạo ra một mẫu loại trực tiếp và một bên mẫu máy chủ, và tạo mô hình khung nhìn Knockout động bằng cách phân tích cú pháp DOM cho mẫu phía máy chủ. Theo cách này, chỉ có mẫu Knockout sẽ hiển thị khi JavaScript được bật và chỉ mẫu bên phía máy chủ mới hiển thị nếu JavaScript bị tắt. Chúng có thể được tạo kiểu theo cách để làm cho chúng trông giống hệt nhau.
Cách tiếp cận khác là áp dụng các ràng buộc cho từng mục trong mảng facets một cách riêng biệt với phần tử DOM hiện có cho khía cạnh đó. Tuy nhiên, điều này vẫn chỉ có một cấp độ sâu và không hoạt động đối với các phần tử lồng nhau.
Không cách nào trong số các phương pháp này có vẻ khá sạch sẽ. Một giải pháp khác có thể là viết một ràng buộc tùy chỉnh xử lý toàn bộ hiển thị và sử dụng lại các phần tử hiện có nếu có thể.
Bất kỳ ý tưởng nào khác?
Tôi đã từ bỏ tăng cường tiến bộ với Knockout. Ngoài bất cứ điều gì * siêu tầm thường * nó chỉ là không thực tế để giữ cho hành vi không KO/KO đồng bộ .. đây là một vấn đề với thậm chí tiêu chuẩn JavaScript PE, nhưng mô hình ràng buộc phong phú của KO làm cho nó một * phân cực cực * trong cách tiếp cận . (Có lẽ có một dự án "Phía máy chủ"? Điều đó sẽ là thú vị nếu nói ít nhất.) – user2864740