Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js KnockoutJS-if绑定性能_Knockout.js_Knockout 2.0 - Fatal编程技术网

Knockout.js KnockoutJS-if绑定性能

Knockout.js KnockoutJS-if绑定性能,knockout.js,knockout-2.0,Knockout.js,Knockout 2.0,我有一个包含50项的可观察数组,使用foreach绑定呈现 我试图理解为什么每个项目呈现的模板都会受到if绑定的影响。本质上,我是基于一个计算的可观察对象来显示或隐藏我的模板的一大块。这给我带来了70-100%的渲染时间增长(与使用可见绑定相比) Ryan Niemeyer指出,将计算结果绑定到if绑定将导致每次更新计算结果的任何部分时,所有内容都重新呈现。但我的计算值在可观测阵列循环通过期间不会改变 this.filtersAvailable = ko.computed(function ()

我有一个包含50项的可观察数组,使用foreach绑定呈现

我试图理解为什么每个项目呈现的模板都会受到
if
绑定的影响。本质上,我是基于一个计算的可观察对象来显示或隐藏我的模板的一大块。这给我带来了70-100%的渲染时间增长(与使用<代码>可见绑定相比)

Ryan Niemeyer指出,将计算结果绑定到
if
绑定将导致每次更新计算结果的任何部分时,所有内容都重新呈现。但我的计算值在可观测阵列循环通过期间不会改变

this.filtersAvailable = ko.computed(function () { 
   return this.searchInfo.searchType() != 'invites' && this.searchInfo.searchType() != 'requests' 
}, this);
为了确保它不会发生变化,我添加了以下内容:

this.filtersAvailable.subscribe(function(newVal) { alert("fa" + newVal); });
this.searchInfo.searchType.subscribe(function(newVal) { alert("st" + newVal); });
这就是说,这个计算模型是在比我的可观察数组的各个视图模型更高的级别上定义的,并且在我的模板中的其他位置重复调用,当然,也被我的可观察数组中的每个其他项重复调用


如果绑定重新渲染,那么重复调用计算的可观察对象是否会导致绑定到它的东西重新渲染?

如果看不到更多的代码,就很难对问题所在形成好的认识。但是,通过使用最新的候选版本Knockout,您可能会看到改进,其中包括对
if
绑定的优化,以消除不必要的重新渲染。可在下载。

反复访问计算的可观测值不是问题,因为每次都会返回缓存值。听起来您的订阅没有显示频繁的更新

使用计算出的值,即使值相同,也会出现这种情况。你可以试着扔一个球​<代码>​​​​​​​​​​​​​​​​​​​​​if部分中选择code>,查看日期更新的频率是否高于预期

如果所有的东西都被一次又一次地重新渲染,那么日期可能会接近相同。对于值为truthy的情况,if绑定的开销稍大一些,因为它获取子元素的一个副本,然后将一个副本呈现为模板并对其进行绑定。visible将只设置显示样式。现在,如果初始值可能为false,并且隐藏部分中有大量标记/绑定,那么if绑定可以为您提供更好的性能。if甚至不会渲染它们,而visible仍然会绑定,但只是隐藏


您也可以尝试命名模板,在那里您有您的if。如果您在
foreach
内部执行
If
,则KO必须在每个foreach项目内部反复复制子元素作为模板。您可以执行

也许你可以在JSFIDLE中得到一个简化的复制?一次又一次地访问计算出的可观测值并不是问题,因为每次都会返回缓存的值。听起来您的订阅没有显示频繁的更新?使用计算出的值,即使值相同,也会出现这种情况。您可以尝试抛出一个
​​​​​​​​​​​​​​​​​​​​​​if
部分中选择code>,查看日期更新的频率是否比预期的要高。@RPN-我添加了一个
,果然,当我滚动呈现的项目列表时,这些值都向上移动。如果它们被不断地重新渲染,我希望它们都是一样的,对吗?这不是一个真正的问题,因为我可以使用
visible
;我只是想弄清楚问题是什么,这样我就有希望学到一些东西。所以你是说,如果基础观测值不经常更新,foreach内部的if绑定不一定会有问题?是的,如果所有内容都被一次又一次地重新呈现,那么日期可能会接近相同。对于值为truthy的情况,
if
绑定的开销稍大一些,因为它获取子元素的副本,然后将副本呈现为模板并对其进行绑定<代码>可见
将只设置
显示
样式。现在,
if
绑定可以在初始值可能为false且隐藏部分中有大量标记/绑定的情况下提供更好的性能
if
甚至不会渲染它们,而
visible
仍然会绑定,但只是隐藏。您也可以尝试命名模板,在那里您有
if
。如果您在
foreach
内部执行
If
,则KO必须在每个
foreach
项目内部反复复制子元素作为模板。你可以做
@RPN-非常感谢你提供的好信息。如果你愿意把它复制成一个答案,我愿意把它标记为接受。