2013-02-12 15 views
5

Tôi có ứng dụng giao diện người dùng Dart + Web trước tiên cần tải dữ liệu từ kho lưu trữ IndexedDB cục bộ. API IndexedDB là không đồng bộ, vì vậy tôi sẽ nhận được một cuộc gọi lại khi dữ liệu của tôi được tải. Tôi không muốn hiển thị bất kỳ phần tử giao diện người dùng nào cho đến khi cơ sở dữ liệu của tôi được mở lần đầu tiên và sẵn sàng hoạt động.Làm cách nào để hiển thị giao diện người dùng của tôi sau khi ứng dụng của tôi được khởi chạy?

Làm cách nào để đợi khởi chạy cơ sở dữ liệu của mình trước khi hiển thị giao diện người dùng?

Trả lời

5

tôi đang làm nó trong dự án của tôi cách Web UI:

... 
<body> 
    <template if="showApplication"> 
    <span>The app is ready.</span> 
    </template> 
</body> 
... 
@observable bool showApplication = false; 

main() { 
    // Initialize... 
    window.indexedDB.open(...).then((_) { 
    showApplication = true; 
    }); 
} 

Điều này cũng có thêm phần thưởng: các thành phần mã/web riêng biệt cũng có thể kiểm tra trạng thái ứng dụng trước khi dựa vào kết nối db, v.v.

3

Ẩn thẻ body với visibility:hidden:

<body style="visibility:hidden"> 
    <!-- content --> 
</body> 

Và sau đó hiển thị nó trong đó() gọi lại của tương lai của bạn

window.indexedDB.open(dbName, 
    version: version, 
    onUpgradeNeeded: createObjectStore).then(handleDBOpened); 

handleDBOpened(..) { 
    query('body').style.visibility = "visible"; // <-- show the body tag 
} 
+1

Điều này không quan trọng, nhưng có một sự khác biệt tinh tế giữa việc sử dụng mức hiển thị (câu trả lời này) và sử dụng a template-if (câu trả lời của Kai) là bất cứ thứ gì bên trong template-if không được đánh giá khi điều kiện là false, vì vậy nếu bạn có: '

' vs '