Cách tốt nhất để ẩn màn hình trong khi các ràng buộc js loại trực tiếp đang được xây dựng là gì?


76

Tôi là một người hâm mộ knockoutjs lớn. Tôi sử dụng nó cho tất cả các phát triển web của tôi bây giờ và chỉ đơn giản là yêu thích nó. Một điều mà tôi không thể tìm ra là làm thế nào để ẩn giao diện người dùng trong khi các ràng buộc knockoutjs đang được xây dựng.

Ví dụ: tôi có một giao diện người dùng rất mạnh mẽ với rất nhiều mẫu được sử dụng trên trang của tôi. Vấn đề mà tôi nhận thấy là khi người dùng truy cập trang lần đầu tiên, họ sẽ thấy tất cả các mẫu của tôi trong tích tắc trước khi các ràng buộc bắt đầu và ẩn chúng đi.

Cách tốt nhất để khắc phục sự cố này là gì? Tôi đã thử sử dụng các lớp trợ giúp để ẩn chúng, nhưng sau đó các mẫu không thể được hiển thị bằng cách sử dụng các liên kết 'hiển thị' và 'nếu' trừ khi tôi xóa tham chiếu lớp trợ giúp (tức là ui-helper-hidden).

Câu trả lời:


71

Có một số chiến lược mà bạn có thể sử dụng ở đây.

-Một là đặt tất cả nội dung thực tế của bạn vào các mẫu nằm trong các thẻ script (hoạt động tốt với các mẫu gốc). Trong mẫu, bạn có thể sử dụng ràng buộc luồng điều khiển. Điều này sẽ giống như:

<div data-bind="template: 'contentTmpl'"></div>

<script id="contentTmpl" type="text/html">
   <ul data-bind="foreach: items">
       <li data-bind="text: name"></li>
   </ul>
</script>

- Một lựa chọn khác là sử dụng style="display: none"trên phần tử vùng chứa cùng với một visibleràng buộc có thể được liên kết với một thứ loadedcó thể quan sát được, nơi bạn thay đổi có thể quan sát thành truesau khi các ràng buộc đã được áp dụng.


1
Đối với bản ghi, tôi đang sử dụng đề xuất 'đã tải' và nó không hoạt động với tôi. Tất cả các tài liệu tham khảo js của tôi đều nằm ở cuối trang của tôi và đánh dấu được hiển thị cho đến khi lệnh gọi applyBindings (dòng cuối cùng của js). Tôi chỉ muốn thêm điều này làm ghi chú vì đó là vấn đề tôi đang cố gắng giải quyết ban đầu. Cảm ơn một lần nữa!
Luc

4
Tôi đã chỉnh sửa câu trả lời để mô tả cách loadedhoạt động của thiết bị có thể quan sát. Bạn cần thêm style="display: none"vào một phần tử vùng chứa cùng với visible: loaded, sau đó chuyển nó thành true sau khi các ràng buộc của bạn đã được áp dụng. Liên visiblekết sẽ loại bỏ display: none(nó không thể kiểm soát những gì có trong css của bạn).
RP Niemeyer

@RPNiemeyer, cách tiếp cận thứ hai có thể không hiệu quả cho SEO nếu máy chủ trả về các trang không phải JS. Trong trường hợp của tôi, knockout thêm một lớp vào giao diện người dùng do máy chủ tạo, display:nonecó thể không được bot chọn.
Jason J. Nathan

196

Tôi chỉ đang google cho điều này và sau khi sử dụng cách có thể quan sát được, tôi đã nghĩ ra một cách tiếp cận khác:

<div style="display: none" data-bind="visible: true">
  <ul data-bind="foreach: items">
    <li data-bind="text: name"></li>
  </ul>
</div>

Bạn không cần một cái có thể quan sát được, cái có thể nhìn thấy sẽ luôn đánh giá là true sau khi việc liên kết dữ liệu được thực hiện.


13
Thông minh! Thêm một tối ưu hóa trên đầu trang của rằng khi bạn không muốn điều đó thêm div: <ul data-bind="foreach: items, visible: true"> <li data-bind="text: name"></li> </ul>
Greg R

15
Thx cho điều đó! Tôi nên thêm rằng tôi vừa thêm style / data-bind vào div hiện có của mình và vì một số lý do mà chỉ ẩn một phần của nó. Vì vậy, tôi đã thêm một div bên ngoài. Btw, tôi cũng đã thêm điều này trước đây <div data-bind='visible: false'> Screen loading... </div>
joelhoro

3
Thông minh! Bạn cũng có thể có một div chứa hoạt ảnh đang tải, với bing dữ liệu là "display: false".
Michael Fry

1
Angular cố gắng làm theo cách quá nhiều. Tôi sẽ luôn thích sự đơn giản của loại trực tiếp kết hợp với các thư viện khác như SammyJS
pim

1
Có lẽ đến bữa tiệc hơi muộn, nhưng bạn có thể làm <div class="beforeReady" data-bind="css: {ready: true}">nếu bạn muốn tạo hoạt ảnh css để hiển thị nó (như độ mờ hoặc thứ gì đó)
Thomas

0

Đây là phương pháp chỉ dành cho CSS nếu bạn lo lắng về các tiện ích con chưa được phân loại hiển thị trước liên kết triển khai MVVM .

[data-role]:not([role], [tabindex]) {
    visibility: hidden;
}

Tôi chưa thử nghiệm nó trên tất cả các vật dụng Kendo, nhưng nó có vẻ hiệu quả với hầu hết mọi người.


0

Đây là cách tiếp cận thay thế bằng cách sử dụng các lớp cho "ẩn và" hiển thị "thay vì một kiểu nội tuyến. Thêm một lớp" ẩn "vào phần tử cần ẩn cho đến khi tải nội dung và thêm liên kết dữ liệu" css "để làm cho nó được hiển thị khi nó bị ràng buộc.

<div class="hide" data-bind="css: {'show': true}">

</div>

Các lớp 'ẩn' và 'hiển thị' đã được định nghĩa trong Bootstrap.

Nếu Bootstrap không được sử dụng, CSS có thể được định nghĩa là:

.hide {
  display: none !important;
}
.show {
  display: block !important;
} 

Thứ tự quan trọng. Lớp "ẩn" nên được định nghĩa trước "hiển thị".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.