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

Posted

技术标签:

【中文标题】我可以得到我正在 foreach 的可观察数组吗?【英文标题】:Can I get the observable array I'm foreach-ing over inside? 【发布时间】:2012-03-27 03:50:43 【问题描述】:

最好用一个例子来解释。 This 是从 Knockout 博客链接到的关于如何使用 $parent 的示例。但是,在这种情况下,$parent 显然与 $root 相同,所以我很难看到它的好处。

上面写着$parent.lastUpdated,我想改为访问可观察数组this.products。我意识到我可以说$root.products。不过,我想概括一下,而不是为每个列表都明确地写出来。

我实际上会将它与ko.contextFor 结合使用。

【问题讨论】:

【参考方案1】:

您无法(通常)访问在 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 -->

【讨论】:

感谢您提供无法完成的信息以及with 解决方法。 这有一个“小”问题(解决方案 1 在可观察数组上使用“with”)..“with”导致子结构重绘(我不得不覆盖“with”的逻辑“为了避免这种情况,但开箱即用我相信这就是它在可观察的突变时的工作方式 - 与 if 相同)导致任何非绑定元素被重置 - 例如,您可能需要未绑定的引导面板。我正在寻求解决这个问题 - 也许设置一个父 $context 变量,该变量在创建子上下文时被克隆,因此 $context['myContextualArrayId'] 就在那里..

以上是关于我可以得到我正在 foreach 的可观察数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

KnockoutJS foreach 不会遍历集合

可观察数组的可观察对象?

knockoutjs 可观察对象绑定的可观察数组

为啥我的 html5 类找不到我的可观察数组内容?

以角度声明对象的可观察数组

如何在 Knockout 中创建计算的可观察数组