2012-04-24 88 views
0

我使用knockout.js渲染我的看法,我是從服務器獲取數據,並且這樣的結合..knockoutJS導致停止腳本錯誤嵌套的foreach

var viewModel = ko.mapping.fromJS(data); 
ko.applyBindings(viewModel, $("#macro-wrapper")[0]); 

我的看法......我修剪的幾個位了......但結合是相同的......

<div data-bind="foreach: Data"> 
<h3> 
    <a href="#" data-bind="text: Site.Name"></a> 
</h3> 
<div id=""> 
    <div data-bind="foreach: Comments"> 
     <div class=""> 
      <div class="" data-bind="click: $root.showContent"> 
      <a ></a> 
      </div> 
      <span> 
       <a data-bind="attr: { 'href': Url }, text: SomeText"></a> 
      </span> 
      <span class=""> 
       <span class="" data-bind="text: ADate"></span> 
      </span> 
     </div> 
    </div> 
</div> 

的數據包含對象的數組,並在每個這些對象的另一個數組... 有大約有500件需要被渲染。

雖然我一直在測試我沒有遇到任何問題,但是在部署時,不管是慢速電腦我都不知道,但他們得到了「這個腳本正在緩慢停止?」信息。 如果您點擊「否」幾次,它會呈現。

什麼是在淘汰賽中處理大數據集的技術?理想情況下,我希望渲染完成異步,並讓用戶在忙於工作時繼續使用它們的東西...

屬性實際上不需要可觀察 - 這是1次渲染...沒有什麼會改變。我使用映射API來簡化操作。

更新: 好的,所以我做了一個改變,不再使用映射API - 頁面正在加載,但仍然緩慢......任何想法? 更改:var viewModel = data;

+1

我有一些客戶抱怨我的基於淘汰賽的網站在safari 4中較老的mac上運行緩慢。還沒有弄清楚。您的用戶使用哪些瀏覽器? – 2012-04-24 13:32:08

+0

鉻,IE9和8. IE8的特殊問題 – SteveCl 2012-04-24 13:33:49

回答

2

點擊事件正在爲每個元素觸發。這發生在我以前。

關於以前的帖子說的是什麼:在一個頁面上綁定500個元素,我不得不在頁面上綁定500多個元素,並且在更現代的瀏覽器上性能成本幾乎可以忽略不計(您可能會看到一些放緩在7-8,但不是太糟糕)。我建議在轉換大型json對象時不要使用映射插件。 KO映射將每個元素與每個其他元素進行比較(以檢查唯一性),因此您可以看到爲什麼convertig 500項目會減慢速度。

0

我覺得從UI的角度來看,在頁面上顯示500項不是一個好主意。也許你應該只顯示頂級項目,並有鏈接「顯示評論」,並且只在用戶請求時提供評論。或者只渲染前面有子項的X個頂級項目,並鏈接「顯示更多」。或者使用上述技術的組合。 這是我在網站上處理同一問題的計劃。

+0

謝謝 - 不幸的是,這不是我的呼籲!用戶界面設計良好。我已經推薦了幾種方法......我不得不說,雖然它們是非常小的物品......其中500個似乎並不是那麼多。實際上,我從另一個角度接近它......在jQuery中使用一些ajax調用和使用延遲對象......它仍然不夠完美,但它只是在不支持UI贖金的情況下裝載。 – SteveCl 2012-04-24 16:27:00