Почему родительская / корневая привязка не выдает ошибку, когда свойство не определено

#knockout.js

#knockout.js

Вопрос:

Почему следующие parent или root привязки не приведут к сбою knockout:

 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:

Если вы переносите привязки внутри анонимной функции, подобной приведенной ниже, она не завершается сбоем —

 <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 ), оценка привязки каким-то образом откладывается на какой-то момент позже.
В то время как в противном случае привязка вычисляется во время создания DOM, во время которого bogus остается неопределенной.