2012-10-17 24 views
3

我希望我的瀏覽器能夠立即訪問,而無需等待加載模板。目前情況並非如此,當我提供一個大型數組(在這種情況下是1000個元素)。 我試過使用External Template Engine,但這只是導致模板顯示「正在加載...」,並且瀏覽器在加載完成之前沒有響應。瀏覽器在生成knockout.js模板時未響應

爲了說明,一個簡單的例子:

JS:

function User(firstname, lastname) { 
    this.firstname = ko.observable(firstname); 
    this.lastname = ko.observable(lastname); 
} 

function UserViewModel() { 
    this.allUsers = ko.observableArray([ 
     new User("John", "Doe"), 
     new User("John", "Doe"), 
     new User("John", "Doe"), 
     // 1000 elements ... 
     new User("John", "Doe") 
    ]); 
} 

ko.applyBindings(new UserViewModel()); 

HTML:

<html> 
    <head> 
    ... 
    </head> 

    <body> 

     <ul data-bind="template: { name: 'my-template', foreach: allUsers() }"></ul> 

     <script type="text/html" id="my-template"> 
      <li> 
       <h1 data-bind="text: firstname()"></h1> 
       <h2 data-bind="text: lastname()"></h2> 
      </li> 
     </script> 

    </body> 
</html> 

所以基本上我想什麼是可訪問時,模板被渲染的瀏覽器,一旦他們準備好了,他們應該可視化。我之前提到的外部模板引擎不符合我的需求。

回答

3

你可以試試這個方法:

Show progress bar while knockout is rendering the view

如果你看一看鏈接的jsfiddle(http://jsfiddle.net/rniemeyer/fdSUU/),你會看到正在使用的方法。

你基本上是從一個單獨的數組開始,然後通過調用setTimeout調用將它們加載到數組中,每次50個項目。這會在數據加載時保持瀏覽器處於活動狀態。

+0

謝謝。對於'常規'數據,這確實可行,但是當我使用自定義對象(例如主題帖子中的User對象)時,它仍然不能正常工作(可能是因爲附加了ko.observable()), 。 –

+0

你確定,布拉姆?這似乎工作正常:http://jsfiddle.net/fdSUU/27/ –

+0

是的,你是對的。我犯了將numToPush變量設置爲初始數組長度的錯誤,但在查看代碼之後,顯然這不是正確的做法。你認爲10是最好的選擇,還是我可以改變這個例如1? –