2014-05-22 20 views
0

我有一个包含大量产品列表(20,000+)的简单网页。当你点击一个产品时,它会加载(通过AJAX)一系列颜色并以内联方式显示。 HTML ...尽可能减少空的observableArray在内存中的使用率

<div data-bind="foreach: products"> 
    <span data-bind="click: $root.loadColors($data), text: $name"></span> 
    <ul data-bind="foreach: colors"> 
     <li data-bind="text:$data" /> 
    </ul 
</div> 

店铺视图模型:

function shopViewModel() 
{ 
    var self = this; 
    self.products = ko.observableArray([]); 

    self.loadColors = function(product) 
    { 
     var data = GetColorsByAjax(); 
     product.colors(data); 
    } 
} 

产品视图模型:

function productModel(data) 
{ 
    var self = this; 
    self.name = data.name; 
    self.colors = ko.observableArray([]); 
} 

当我有20,000的产品,它使用了大量的内存。每个产品都有一个颜色的数组,它总是为空/空,直到用户点击它,但仍使用大量内存。

理想情况下,我想删除颜色 observableArray,并在用户点击产品时以某种方式动态创建它。或者将它分成一个新的视图模型。

我想消除空的observableArrays以尽量减少内存,但无法弄清楚它是如何做到的。

+0

你可能有兴趣在检查出CodeReview.StackExchange.com。你的问题写得很好,很清楚,但是却是开放式的:有很多方法可以解决你手边的问题(消除数组)以及潜在的问题(有太多的对象)。那里的用户可能可以帮助你们,比在SO上更好。 – Jeroen

+0

公平点。我试图找到一个'问题'问,但找不到合适的单词。我无法减少对象的数量。我遇到的问题是绑定到一个元素,并绑定了一个DOM树。 –

+0

而不是加载这么多的结果,你可以使用服务器端分页 – Akhlesh

回答

0

我会使用Knockout的控制流绑定(如果有)绑定的颜色之一:foreach productModel()上实际上有colors属性。

HTML:

<div data-bind="foreach: products"> 
    <span data-bind="click: $root.loadColors($data), text: $name"></span> 
    <div data-bind="if: hasColors"> 
     <ul data-bind="foreach: colors"> 
      <li data-bind="text:$data" /> 
     </ul> 
    </div> 
</div> 

查看产品型号:

function productModel(data) 
{ 
    var self = this; 
    self.name = data.name; 
    self.hasColors = ko.observable(false); 
    self.colors = null; 
} 

商店看型号

function shopViewModel() 
{ 
    var self = this; 
    self.products = ko.observableArray([]); 

    self.loadColors = function(product) 
    { 
     var data = GetColorsByAjax(); 
     if(product.colors == null) { 
      product.colors = ko.observableArray(data); 
      product.hasColors(true); 
     } else { 
      product.colors(data); 
     } 
    } 
} 
+0

谢谢迈克尔。这是一个好点,但不是我遇到的问题。这会明显减少DOM的大小,从而减少浏览器中的内存使用量。我已经在我的'更全面'版本中实现了这一点。我遇到的主要问题是可观察阵列耗尽了内存,甚至认为它并不经常使用。 –

0

你不必来存储一个空数组观察到的:你可以默认undefined和Knockout会将其视为foreach绑定中的空阵列。

这里有一个演示:http://jsfiddle.net/zm62T/

+0

但是,如果您在执行初始ko.applyBindings之前未将其声明为observableArray,那么敲除操作是否会检测到此更改?我不确定会不会。我将其更改为observableArray后,需要重新绑定元素。 –

+0

啊,我误解了你的要求:我没有意识到你的颜色可能会改变。嗯,我可以看到一个解决方案使用稀疏映射,但它会更新稀疏映射的任何更新的每个元素。你真的需要一次展示所有20,000件物品吗? – Rafe

+0

理想情况是的,但在现实中,我认为这是不可能的。 –