Javascript 在foreach中为组件参数使用$data进行敲除

Javascript 在foreach中为组件参数使用$data进行敲除,javascript,knockout.js,Javascript,Knockout.js,我开始使用组件,但我正在努力使用这个简单的代码 当我在函数viewModel(params)中放置断点时,对象params.data是我的视图模型viewModelHelloWorld,而我希望它是数组的一项。我做错了什么 Html: 好吧,我有点被这个难住了。我试过你的例子,得到了同样的结果。因此,解析自定义元素和解析数据绑定肯定有些不同 但是有一个解决办法。如果使用,则$data变量将按预期工作。e、 g <table data-bind="foreach: arrays">

我开始使用组件,但我正在努力使用这个简单的代码

当我在函数
viewModel(params)
中放置断点时,对象
params.data
是我的视图模型
viewModelHelloWorld
,而我希望它是数组的一项。我做错了什么

Html:


好吧,我有点被这个难住了。我试过你的例子,得到了同样的结果。因此,解析自定义元素和解析数据绑定肯定有些不同

但是有一个解决办法。如果使用,则
$data
变量将按预期工作。e、 g

<table data-bind="foreach: arrays">
  <!-- ko component: { name: 'test-component', params: {data: $data} } -->
  <!-- /ko -->
</table>


我感觉foreach中的隐式模板在应用foreach之前就被解析了,因此它是在主视图模型上下文ergo viewModel===$data中被解析的,而不是在foreach循环中被解析的。但这只是一个理论。

我不知道您在
元素中使用了自定义标记。显然,浏览器正在将其推出,因为它不是有效的子项。浏览器正在有效地执行以下操作:

<test-component params="data: $data"></test-component>
<table data-bind="foreach: arrays">
</table>
您仍然可以为组件中的每一行添加更多列。或者更好的方法是,将整个表作为一个组件,并以这种方式构建视图。这是最有意义的


我们以前遇到过类似的情况。

我同意。我注意到绑定是在foreach绑定的上下文更改生效之前应用的。我认为问题在于“ControlDegenantBindings”标志不适用于自定义元素。“foreach”绑定将“ControlDegenantBindings”设置为true,以阻止knockout将绑定应用于内部HTML。但这似乎并不影响自定义元素解析。啊,我知道它是什么。这是我以前说过的。简而言之,浏览器正在尝试做正确的事情,并将自定义元素从表中推出,因为它不是有效的元素。
<table data-bind="foreach: arrays">
  <!-- ko component: { name: 'test-component', params: {data: $data} } -->
  <!-- /ko -->
</table>
<test-component params="data: $data"></test-component>
<table data-bind="foreach: arrays">
</table>
<table data-bind="foreach: arrays">
    <tr data-bind="component: { name: 'test-component', params: $data }"></tr>
</table>

<script type="text/html" id="line-items">
    <td data-bind="text: Key"></td>
</script>
ko.components.register('test-component', {
    template: { element: 'line-items' },
    viewModel: function viewModel(params) {
        this.Key = ko.observable(params.Key);
    }
});