用函数列表敲除foreach

Knockout foreach with list of functions

本文关键字:foreach 列表 函数      更新时间:2023-09-26

在函数列表上使用foreach绑定时遇到问题。我希望内部上下文是函数本身,但相反,上下文绑定到调用函数的结果。这里有一个简单的例子来说明这一点:(JSFiddle)

JS:

ko.applyBindings({
    list: [
        function() {
            return "hodor";
        }
    ]
});

HTML:

<!-- ko foreach: list -->
<span data-bind="text: typeof $data"></span>
<span data-bind="text: $data"></span>
<br />
<!-- /ko -->

输出是:"string foo",但我希望它是"function function(){return"foo";}"

作为一种变通方法,我可以使用$parent.list[$index()],但这真的很难看,如果可能的话,我希望避免这种语法。

(为了在我的实际使用中进行解释,这些不是简单的函数,而是我附加了额外属性的函数,我想引用它们,但我不能引用它们,因为敲除正在调用它们)

编辑:

这里似乎有一个KO版本的问题。在3.0之前,这不是问题,上下文总是绑定到函数而不是值。在3.0上,使用$rawData会给出函数,而不是那个值,但在3.2上,它不会,这就是我试图使用的。

我已经将上面的fiddle更新为使用3.2,这里为每个版本提供了一个fiddle,包括$rawData(除了2.3中不存在$rawData)

击倒2.3小提琴:$rawData不需要

淘汰赛3.0小提琴:$rawData作品

淘汰赛3.2小提琴:$rawData不起作用。

这可能是一个KO 3.2错误吗?

不,这是KO 3.0中的一个错误。

在<2.3这是一个缺失的功能。因为如果没有$rawData,就无法使用包含observablez [ko.observable(1), ko.observable(2)]的数组。

在3.0中引入了$rawData,但它存在缺陷。已在3.1中修复https://github.com/knockout/knockout/pull/1206.

因此,这是daedalus28在上述链接问题中总结的正确行为:

如果$rawData是一个函数而不是一个可观测值,那么它应该是返回值。如果它是可观察的(或函数的结果是可观察到的),则应将其展开为$data,而不是$rawData-$rawData应保留实际的可观察(函数的结果)

所以目前KO不支持您的用例。

因此,您必须在$parent.list[$index()]上使用,或者不要直接将函数放入数组中。

将它们包裹到可观测

 list: [
        ko.observable(function() {
            return "foo";   
        }),
        ko.observable(function() {
            return "bar";
        }),
        ko.observable(function() {
            return "hodor";
        })
    ]

演示JSFiddle。

或者把它们放在一些虚拟物体上:

list: [
    {bar: function() {
        return "foo";   
    }},
    {bar: function() {
        return "bar";
    }},
    {bar: function() {
        return "hodor";
    }}
]

你写道:

<span data-bind="text: bar"></span>

演示JSFiddle。