2014-10-29 119 views
3

我在使用foreach绑定函数列表时遇到了问题。我希望内部上下文成为函数本身,但相反,上下文被绑定到调用函数的结果。下面是说明了一个简单的例子:(JSFiddleKnockout foreach与函数列表

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 --> 

输出是: “字符串foo” 的,但我想它是“功能函数(){return“foo”;}“

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

(对于我的实际使用说明,这些都不是我所附加的额外属性,我要引用简单的功能,但功能,但我不能引用他们,因为淘汰赛被调用它们)

编辑:

看来,这里有一个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的错误?

+0

我敢肯定,它有些混淆了它如何假设一个函数将成为一个可观察对象,因此调用它。一个可能的解决办法可能是将你的函数封装在另一个函数中,像这样:http://jsfiddle.net/dq4ec706/3/但是看起来确实很愚蠢。它使'$ data'在3.0和3.2都可以工作,但不能在2.3。 – 2014-10-29 18:12:05

+0

是的,我宁愿使用'$ parent.list [$ index()]'解决方法,它总是起作用,而不是再次包装我的函数。 – Retsam 2014-10-29 18:16:22

回答

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

+0

我不确定我遵循他们为什么应该总是为我解开函数的逻辑,而观察者不是;但我想我可以在你发布的问题上接受它,如果我想。感谢你的回答! – Retsam 2014-10-29 18:24:33