当未定义属性时,为什么父/根绑定不会引发错误

时间:2019-03-26 15:05:45

标签: knockout.js

为什么以下parentroot绑定不会导致淘汰赛崩溃:

ko.applyBindings({
  child: {}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<!-- ko with: child -->
<input type="checkbox" data-bind="checked: $parent.bogus">
<input type="text" data-bind="text: $root.bogus">
<!-- /ko -->

...这一个...

ko.applyBindings({
  child: {}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<input type="checkbox" data-bind="checked: bogus">

...还有这个...

ko.applyBindings({
  child: {}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<input type="text" data-bind="text: bogus">

...是否通过错误消息“未定义伪造”正确使崩溃删除?

我希望所有这些都崩溃。 $ parent / $ root绑定不应该崩溃是有原因的吗?

1 个答案:

答案 0 :(得分:1)

如果将绑定包装在一个匿名函数(如下面的函数)中,它不会崩溃-

<input type="checkbox" data-bind="checked: function() {bogus}">
<input type="text" data-bind="text: function(){bogus}">

或下面的上下文切换中

<!--ko with: child-->
<input type="checkbox" data-bind="checked: $parent.bogus">
<input type="text" data-bind="text: $root.bogus">
<!--/ko-->

但是,当您立即按如下所示在绑定中调用该函数时,它就会崩溃-

<input type="checkbox" data-bind="checked: function() {bogus}()">
<input type="text" data-bind="text: function(){bogus}()">

甚至是-

<input type="checkbox" data-bind="checked: $parent.bogus">
<input type="text" data-bind="text: $root.bogus">

因此,在我看来,当用with(或可能是using)之类的上下文开关包装绑定时,绑定评估会以某种方式推迟到某个时候。 如果不是,则在创建bogus时定义DOM时评估绑定。