淘汰foreach与功能列表

时间:2014-10-29 17:34:12

标签: javascript knockout.js

我在使用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 -->

输出为:&#34; string foo&#34;但我希望它是&#34; function function(){return&#34; foo&#34 ;; }&#34;

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

(在我的实际用法中的解释,这些不是简单的函数,但我已经附加了我想要引用的额外属性的函数,但我无法引用它们,因为knockout正在调用它们)

编辑:

这里似乎存在KO版本问题。在3.0之前,它不是一个问题,上下文总是绑定到函数而不是值。在3.0上,使用$rawData将提供功能,而不是该值,但在3.2上,它不会,这是我尝试使用的。

我已经更新了使用3.2的上述小提琴,这里是每个版本的小提琴,包括$rawData(除了2.3,其中$ rawData不存在)

Knockout 2.3 fiddle$rawData不需要

Knockout 3.0 fiddle$rawData有效

Knockout 3.2 fiddle$rawData无效。

这可能是KO 3.2错误吗?

1 个答案:

答案 0 :(得分:2)

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

In&lt; 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