Javascript 带函数列表的敲除foreach
在函数列表上使用foreach绑定时遇到问题。我希望内部上下文是函数本身,但是相反,上下文绑定到调用函数的结果。下面是一个简单的例子来说明这一点:() JS: HTML:Javascript 带函数列表的敲除foreach,javascript,knockout.js,Javascript,Knockout.js,在函数列表上使用foreach绑定时遇到问题。我希望内部上下文是函数本身,但是相反,上下文绑定到调用函数的结果。下面是一个简单的例子来说明这一点:() JS: HTML: <!-- ko foreach: list --> <span data-bind="text: typeof $data"></span> <span data-bind="text: $data"></span> <br /> <!-- /ko
<!-- ko foreach: list -->
<span data-bind="text: typeof $data"></span>
<span data-bind="text: $data"></span>
<br />
<!-- /ko -->
输出是:“stringfoo”,但我希望它是“function(){return“foo”;}”
作为一种解决方法,我可以做$parent.list[$index()]
,但这确实很难看,如果可能的话,我希望避免使用这种语法
(为了解释我的实际用法,这些不是简单的函数,而是我附加了额外属性的函数,我想引用它们,但我不能引用它们,因为knockout正在调用它们)
编辑:
这里似乎有一个KO版本的问题。在3.0之前,这不是一个问题,上下文总是绑定到函数而不是值。在3.0上,使用$rawData
会给出函数,而不是该值,但在3.2上不会,这正是我试图使用的
我已经将上面的fiddle更新为使用3.2,下面是每个版本的fiddle,包括$rawData
(除了在2.3中,$rawData不存在)
:$rawData
不需要
:$rawData
有效
:$rawData
不起作用
这可能是KO 3.2的错误吗?不,这是KO 3.0中的错误 在<2.3中,这是一个缺失的特征。因为如果没有
$rawData
,您就无法使用包含observable的数组[ko.obbservable(1),ko.obbservable(2)]
在3.0中引入了$rawData,但它有缺陷。这在3.1中是固定的
因此,这是上述相关问题中总结的正确行为:
$rawData
如果它是一个函数而不是一个可观察值,则应该是返回值。如果它是可观察的(或函数的结果是可观察的),则应将其展开为$data
,而不是$rawData
-$rawData
应保留实际可观察的(函数的结果)
因此,目前KO不支持您的用例
因此,您必须在$parent.list[$index()]
上使用,或者不要直接将函数放入数组中
把它们包装成可见光
list: [
ko.observable(function() {
return "foo";
}),
ko.observable(function() {
return "bar";
}),
ko.observable(function() {
return "hodor";
})
]
演示
或者把它们放在一些虚拟对象上:
list: [
{bar: function() {
return "foo";
}},
{bar: function() {
return "bar";
}},
{bar: function() {
return "hodor";
}}
]
你写道:
<span data-bind="text: bar"></span>
演示。我确信这与它假设函数是可观察的并因此调用它的方式有些混淆。一种可能的解决方法可能是将您的函数包装到另一个函数中,如下所示:但这看起来非常非常愚蠢。它使
$data
在3.0和3.2上都能工作,但在2.3中不行。是的,我宁愿使用$parent.list[$index()]
变通方法,这总是有效的,而不是我个人再次包装我的函数。我不确定我是否遵循了他们的逻辑,为什么函数总是要为我打开,而观察对象却不能;但我想如果我愿意的话,我可以就你发布的问题发表意见。谢谢你的回答!
<span data-bind="text: bar"></span>