此问题基于此处的淘汰赛在线教程的第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,动态地添加或删除后代元素。

07-24 18:58
查看更多