我可以得到我在foreach里面的可观察数组吗?

问题描述:

这可能最好用一个例子来解释。 This是关于如何使用$parent从Knockout博客链接的示例。但是,在这种情况下,$parent显然与$root相同,所以我无法看到好处。我想改为访问可观察数组,this.products。我意识到我可以说$root.products。不过,我想概括一下,而不是为每个列表明确写出。我可以得到我在foreach里面的可观察数组吗?

我实际上会使用这个结合ko.contextFor

您无法访问(通常)访问直接在foreach循环内循环的observableArray。

$root$parent是关于范围,所以它只会给你包含observableArray的对象。

但是,您可以通过使用with绑定来确保范围是您的observableArray,从而充分利用此优势。

如果你只需要对底层数组,那么你可以做:

<div data-bind="with: products"> 
    <ul data-bind="foreach: $data"> 
     <li> 
      <strong data-bind="text: name"></strong> 
      &mdash; 
      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> 
      &mdash; 
      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> 
      &mdash; 
      Array length: <em data-bind="text: $parent.theArray().length"></em> 
     </li> 
    </ul> 
<!-- /ko --> 
+0

非常感谢无法完成的信息以及“带有”解决方法。 – 2012-03-12 04:46:30

+0

这有一个“小问题”(解决方案1在可观察数组上使用“with”)。“with”会导致重绘子结构(我必须覆盖“with”的逻辑以避免这种情况,该框我相信这是它如何工作的突变的观察 - 与if一样)导致任何*元素被重置 - 你可能需要引导面板,例如没有绑定。我正在寻求解决这个问题 - 也许设置一个父$上下文变量,这是在创建子上下文时克隆的,所以$ context ['myContextualArrayId']就在那里.. – 2016-09-14 18:31:20