如何在敲除的嵌套for循环中进行数据绑定时比较两个数据
How to compare two data while data-binding in nested for loop in knockout
假设有一个 JSON 文件包含:
{
"First" : [
"A",
"B",
"C"
],
"Second" : [
{ "name" : "A"},
{ "name" : "C"}
]
}
现在,下面是我的 HTML 代码的一小部分,用于展示我正在努力实现的目标:
<span data-bind="foreach: First">
<span data-bind="foreach: Second">
//if First.A === Second.name then do something
</span>
</span>
我该如何比较?
我尝试了很多东西,但无法找出正确的方法。
我知道 $data 可用于访问 "First" 的值,但在此嵌套循环中使用什么?
我是新来的。任何建议将不胜感激。
更多信息:
我的 HTML 代码实际上是这样的:
<span data-bind="foreach: first">
<tbody data-bind="foreach: $root.second">
<tr data-bind="if: $parent === $data.name">
//do something
</tr>
</tbody>
.
.
.
</span>
这行不通。
首先,您问题末尾的 html 无效:您不能在 span
中包含 tbody
(尝试一下:您会看到浏览器忽略 tbody
)。
现在,对于你的问题:我编写了一个与你的案例相似的视图模型,并根据 html.
这里要理解的重要一点是 $parent
指的是父上下文中的视图模型对象。因此,在下面的html中,foreach: $parent.seconds
中的$parent
指的是myVM
上下文,而if: $parent
中的$parent
指的是firsts
上下文。
var myVM = function () {
var self = this;
self.firsts = ['A', 'B', 'C'];
self.seconds = [{ "name" : "A"}, { "name" : "C"},];
};
ko.applyBindings(new myVM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<span data-bind="foreach: firsts">
<span data-bind="foreach: $parent.seconds">
<span data-bind="if: $parent == $data.name">hello!</span>
</span>
</span>
还有其他编码方式,另一种方式是 - 如果对您更方便的话 - 将 $parent.seconds
更改为 $root.seconds
(并获得相同的结果):
var myVM = function () {
var self = this;
self.firsts = ['A', 'B', 'C'];
self.seconds = [{ "name" : "A"}, { "name" : "C"},];
};
ko.applyBindings(new myVM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<span data-bind="foreach: firsts">
<span data-bind="foreach: $root.seconds">
<span data-bind="if: $parent == $data.name">hello!</span>
</span>
</span>
此外,我们可以通过添加别名来提高可读性:
var myVM = function () {
var self = this;
self.firsts = ['A', 'B', 'C'];
self.seconds = [{ "name" : "A"}, { "name" : "C"},];
};
ko.applyBindings(new myVM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<span data-bind="foreach: { data: firsts, as: 'first' }">
<span data-bind="foreach: { data: $root.seconds, as: 'second' }">
<span data-bind="if: first == second.name">hello!</span>
</span>
</span>
假设有一个 JSON 文件包含:
{
"First" : [
"A",
"B",
"C"
],
"Second" : [
{ "name" : "A"},
{ "name" : "C"}
]
}
现在,下面是我的 HTML 代码的一小部分,用于展示我正在努力实现的目标:
<span data-bind="foreach: First">
<span data-bind="foreach: Second">
//if First.A === Second.name then do something
</span>
</span>
我该如何比较? 我尝试了很多东西,但无法找出正确的方法。 我知道 $data 可用于访问 "First" 的值,但在此嵌套循环中使用什么? 我是新来的。任何建议将不胜感激。
更多信息: 我的 HTML 代码实际上是这样的:
<span data-bind="foreach: first">
<tbody data-bind="foreach: $root.second">
<tr data-bind="if: $parent === $data.name">
//do something
</tr>
</tbody>
.
.
.
</span>
这行不通。
首先,您问题末尾的 html 无效:您不能在 span
中包含 tbody
(尝试一下:您会看到浏览器忽略 tbody
)。
现在,对于你的问题:我编写了一个与你的案例相似的视图模型,并根据 html.
这里要理解的重要一点是 $parent
指的是父上下文中的视图模型对象。因此,在下面的html中,foreach: $parent.seconds
中的$parent
指的是myVM
上下文,而if: $parent
中的$parent
指的是firsts
上下文。
var myVM = function () {
var self = this;
self.firsts = ['A', 'B', 'C'];
self.seconds = [{ "name" : "A"}, { "name" : "C"},];
};
ko.applyBindings(new myVM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<span data-bind="foreach: firsts">
<span data-bind="foreach: $parent.seconds">
<span data-bind="if: $parent == $data.name">hello!</span>
</span>
</span>
还有其他编码方式,另一种方式是 - 如果对您更方便的话 - 将 $parent.seconds
更改为 $root.seconds
(并获得相同的结果):
var myVM = function () {
var self = this;
self.firsts = ['A', 'B', 'C'];
self.seconds = [{ "name" : "A"}, { "name" : "C"},];
};
ko.applyBindings(new myVM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<span data-bind="foreach: firsts">
<span data-bind="foreach: $root.seconds">
<span data-bind="if: $parent == $data.name">hello!</span>
</span>
</span>
此外,我们可以通过添加别名来提高可读性:
var myVM = function () {
var self = this;
self.firsts = ['A', 'B', 'C'];
self.seconds = [{ "name" : "A"}, { "name" : "C"},];
};
ko.applyBindings(new myVM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<span data-bind="foreach: { data: firsts, as: 'first' }">
<span data-bind="foreach: { data: $root.seconds, as: 'second' }">
<span data-bind="if: first == second.name">hello!</span>
</span>
</span>