最好用一个例子来解释。 This是一个关于如何使用$parent
的Knockout博客链接的示例。但是,在这种情况下,$parent
显然与$root
相同,所以我很难看到这种好处。
如果说$parent.lastUpdated
,我想改为访问可观察数组this.products
。我意识到我可以说$root.products
。但是,我想概括一下,而不是为每个列表明确写出来。
我实际上会将其与ko.contextFor
结合使用。
答案 0 :(得分:27)
您无法访问(通常)直接在foreach循环内部循环的observableArray。
$root
和$parent
是关于范围的,所以它只会给你包含observableArray的对象。
但是,您可以通过使用with
绑定确保范围是您的observableArray来利用此功能。
如果您只需要底层数组,那么您可以这样做:
<div data-bind="with: products">
<ul data-bind="foreach: $data">
<li>
<strong data-bind="text: name"></strong>
—
Array length: <em data-bind="text: $parent.length"></em>
</li>
</ul>
</div>
如果你真的需要observableArray,那么你需要确保它还没有被解包(在上面的例子中$data
已经解开了)。为此,您可以规范化数组的名称并在模板中查找,如:
<div data-bind="with: { theArray: products }">
<ul data-bind="foreach: theArray">
<li>
<strong data-bind="text: name"></strong>
—
Array length: <em data-bind="text: $parent.theArray().length"></em>
</li>
</ul>
</div>
以下是一个示例:http://jsfiddle.net/rniemeyer/T6JvV/
如果您不能使用额外的div
,那么您当然可以使用无容器控制流绑定,例如:
<!-- ko with: { theArray: products } -->
<ul data-bind="foreach: theArray">
<li>
<strong data-bind="text: name"></strong>
—
Array length: <em data-bind="text: $parent.theArray().length"></em>
</li>
</ul>
<!-- /ko -->