此问题基于此处的淘汰赛在线教程的第2步中的代码:
以这个jsfiddle为例:http://learn.knockoutjs.com/#/?tutorial=webmail
当前的第10行到第12行使用with
敲除绑定:
<table class="mails" data-bind="with: chosenFolderData">
<thead><tr><th>From</th><th>To</th><th>Subject</th><th>Date</th></tr></thead>
<tbody data-bind="foreach: mails">
本教程说明:
with绑定会创建一个绑定上下文,该绑定上下文将在绑定其中的任何元素时使用。在此示例中,内的所有内容都将绑定到selectedFolderData,因此不必使用selectedFolderData。作为邮件前的前缀。
我基于测试上面的引用,尝试将10至12行替换为以下内容:
<table class="mails">
<thead><tr><th>From</th><th>To</th><th>Subject</th><th>Date</th></tr></thead>
<tbody data-bind="foreach: chosenFolderData().mails">
我在控制台中收到一个
Cannot read property 'Inbox' of undefined
错误。在本教程中,为什么要使用
with
绑定才能使代码起作用?我知道它正在改变绑定概念,但是为什么不能手动选择带有chosenFolderData.
前缀的绑定上下文? 最佳答案
with
绑定发生的情况是,如果您要与with
绑定的属性为null或未定义,它将跳过内部的绑定(实际上不会呈现这些元素)。当您删除with
时,它会尝试绑定未定义的chosenFolderData
,因此所有内部属性绑定都会失败。一旦遇到错误,敲除将退出并尝试绑定模型的其余部分。
您可以使用if
绑定获得相同的结果:
<table class="mails" data-bind="if: chosenFolderData">
<thead><tr><th>From</th><th>To</th><th>Subject</th><th>Date</th></tr></thead>
<tbody data-bind="foreach: chosenFolderData().mails">
由于
if
绑定将为您提供类似的结果。见http://jsfiddle.net/PKDdG/166/with
是一种方便的方式,可以节省您不得不长时间访问属性的麻烦。在docs中提到了这一点,但它可能并不太清楚:
with绑定将根据关联的值是否为null / undefined,动态地添加或删除后代元素。