Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带函数列表的敲除foreach_Javascript_Knockout.js - Fatal编程技术网

Javascript 带函数列表的敲除foreach

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

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

JS:

HTML:

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