【发布时间】:2017-09-06 13:52:56
【问题描述】:
我经常在淘汰赛中使用if 绑定来隐藏某些内容,另外我不需要担心if 中的空引用错误。在此示例中,如果 address() 为 null,则整个块将被删除,因此您不必处理每个属性的 null 检查。如果我使用 visible 绑定,情况就不会如此。
<div data-bind="if: address()">
You live at:
<p data-bind="text: address().street.toUpperCase()"></p>
</div>
这是上面最简单的情况 - 是的,我通常会将此模式与 <!-- ko --> 注释语法一起使用。
当我使用更复杂的computed 值并启用ko.options.deferUpdates 选项时,实际上导致我出现问题的原因是:
<div data-bind="if: hasAddress()">
You live at:
<p data-bind="text: address().street.toUpperCase()"></p>
</div>
这个computed observable 的最简单实现可能是这样的:
this.hasAddress = ko.computed(function () { return _this.address() != null; });
这一切都很好,直到我执行以下操作:
1) 在创建 observables 之前设置
ko.options.deferUpdates = true。2)
address()将以 null 开始,一切正常3) 将
address()设置为{ street: '123 My Street' }。再次一切正常。4) 将
address()重置为空。我收到一个空错误,因为address().street是 空:-(这是一个说明问题的小提琴:https://jsfiddle.net/g5gvfb7x/2/
不幸的是,由于微任务运行的顺序,它尝试在 if 绑定之前重新计算 text 绑定,因此您仍然会收到通常不会发生的空错误。
我有点害怕,因为我经常使用这种模式:-(
【问题讨论】:
-
很好,v.3.4.2 中的同样问题。从现在开始,我将按照您的提示在开发过程中始终记录 ko.errors 和 window.errors。
标签: knockout.js