Knockout.js 敲除嵌套的ObservalArrays看起来是未定义的,而不是空的。

Knockout.js 敲除嵌套的ObservalArrays看起来是未定义的,而不是空的。,knockout.js,Knockout.js,如果将聚合函数应用于使用空数组([])初始化的嵌套ObservalArray,则会出现内部数组未定义的错误。这仅适用于以空数组作为参数构造的ObservalArray对象 这可能是一个错误,但也许/希望我只是错过了一些东西 以下示例适用于注释掉的空数组行: 另外,关于: HTML: <ul data-bind="template: { name: 'outerTmpl', foreach: outerArray}"></ul> Number of inner it

如果将聚合函数应用于使用空数组([])初始化的嵌套ObservalArray,则会出现内部数组未定义的错误。这仅适用于以空数组作为参数构造的ObservalArray对象

这可能是一个错误,但也许/希望我只是错过了一些东西

以下示例适用于注释掉的空数组行:

另外,关于:

HTML:

    <ul data-bind="template: { name: 'outerTmpl', foreach: outerArray}"></ul>
Number of inner items: <span data-bind="text: innerCount"></span>
<hr />

<div data-bind="text: ko.toJSON(viewModel)"></div>

<script id="outerTmpl" type="text/html">
    <li>
        <span data-bind="text: name"></span>
        <ul data-bind="template: { name: 'innerTmpl', foreach: innerArray}"></ul>
    </li>
</script>

<script id="innerTmpl" type="text/html">
    <li>
        <span data-bind="text: name" />
    </li>
</script>

我想你会想要更像:

viewModel.innerCount = ko.dependentObservable(function() {
    return this.outerArray().reduce(function(i, j) {
        var count = i.innerArray ? i.innerArray().length : i;
        return count + j.innerArray().length;
    });
}, viewModel);

问题是reduce将在下一次迭代中将上一个结果作为
i
传递。因此,在第一次迭代中只有两个数组

哦,看起来我在那件事上找错地方了。虽然我不确定我写reduce函数时抽的是什么(我来自linq,非常想念它),但我很高兴这个问题是我的,而不是框架。是的,你可以简化它,只需循环outerArray并添加每个innerArray的长度。更新:代码在其他地方不好(见下面的答案)-真的,这个问题与knockout.js无关。结束这个问题,因为实际问题与这个问题无关。别担心,这种情况实际上经常发生:)
viewModel.innerCount = ko.dependentObservable(function() {
    return this.outerArray().reduce(function(i, j) {
        var count = i.innerArray ? i.innerArray().length : i;
        return count + j.innerArray().length;
    });
}, viewModel);