我在使用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错误吗?
答案 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。