CSS 绑定在 Knockout JS 中不起作用
CSS binding not working in Knockout JS
我是 Knockout JS 的新手,因此需要您的帮助来解决一个小问题。我正在尝试根据条件将 css 样式与 CSHTML 页面中的 table 行绑定。我添加了 2 行,但使用 'visible' 属性为每个项目只显示了一行。以下是我的 cshtml 代码:
<table class="listing">
<tbody class="no-wrap" data-bind="foreach: searchResultsListing.pagedItems, select: searchResultsListing">
<tr class="selectable" data-bind="visible: !$root.isMatchedCase($data), css: { selected: $root.searchResultsListing.isSelected($data) }">
<td class="check"><span></span></td>
--
--
<tr/>
<tr class="selectablematch" data-bind="visible: $root.isMatchedCase($data), css: { selected: $root.searchResultsListing.isSelected($data) }">
<td class="check"><span></span></td>
--
--
<tr/>
底层打字稿:在app.listing.ts文件中:
isSelected(item: T) {
return this.selectedItems.indexOf(item) >= 0;
}
如您所见,根据 isMatchedCase()
方法(returns 布尔值)的结果,我显示了 tr(selectable 或 selectable匹配)。问题是 tr 上的 css 仅与第一个 tr 绑定,即与 class selectable 绑定,而不与 selectablematch tr 绑定.当为 'selectablematch'
tr 单击第一个 td 中的复选框时,不会调用方法 'isSelected($data)'
。你们能告诉我我在这里缺少什么吗?
我有点困惑为什么你需要有 2 tr
开始。您可以做的是有一个 computed
,它将 return 为您提供正确的 class,并且只有一行始终可见。不需要处理hide/show等
Look at this article on the css binding 以及它是如何完成的。这是我的建议:
<table class="listing">
<tbody class="no-wrap" data-bind="foreach: searchResultsListing.pagedItems, select: searchResultsListing">
<tr data-bind="css: { rowClass($data), selected: $root.searchResultsListing.isSelected($data) }">
<td class="check"><span></span></td>
<tr/>
</tbody>
</table>
还有你的 pureComputed(包装在一个函数中所以我们可以传递 $data):
var rowClass = function(data) {
return ko.pureComputed(function(){
return isMatchedCase(data) ? 'selectablematch' : 'selectable')
)}
}
我认为这应该会让你朝着正确的方向前进。
我是 Knockout JS 的新手,因此需要您的帮助来解决一个小问题。我正在尝试根据条件将 css 样式与 CSHTML 页面中的 table 行绑定。我添加了 2 行,但使用 'visible' 属性为每个项目只显示了一行。以下是我的 cshtml 代码:
<table class="listing">
<tbody class="no-wrap" data-bind="foreach: searchResultsListing.pagedItems, select: searchResultsListing">
<tr class="selectable" data-bind="visible: !$root.isMatchedCase($data), css: { selected: $root.searchResultsListing.isSelected($data) }">
<td class="check"><span></span></td>
--
--
<tr/>
<tr class="selectablematch" data-bind="visible: $root.isMatchedCase($data), css: { selected: $root.searchResultsListing.isSelected($data) }">
<td class="check"><span></span></td>
--
--
<tr/>
底层打字稿:在app.listing.ts文件中:
isSelected(item: T) {
return this.selectedItems.indexOf(item) >= 0;
}
如您所见,根据 isMatchedCase()
方法(returns 布尔值)的结果,我显示了 tr(selectable 或 selectable匹配)。问题是 tr 上的 css 仅与第一个 tr 绑定,即与 class selectable 绑定,而不与 selectablematch tr 绑定.当为 'selectablematch'
tr 单击第一个 td 中的复选框时,不会调用方法 'isSelected($data)'
。你们能告诉我我在这里缺少什么吗?
我有点困惑为什么你需要有 2 tr
开始。您可以做的是有一个 computed
,它将 return 为您提供正确的 class,并且只有一行始终可见。不需要处理hide/show等
Look at this article on the css binding 以及它是如何完成的。这是我的建议:
<table class="listing">
<tbody class="no-wrap" data-bind="foreach: searchResultsListing.pagedItems, select: searchResultsListing">
<tr data-bind="css: { rowClass($data), selected: $root.searchResultsListing.isSelected($data) }">
<td class="check"><span></span></td>
<tr/>
</tbody>
</table>
还有你的 pureComputed(包装在一个函数中所以我们可以传递 $data):
var rowClass = function(data) {
return ko.pureComputed(function(){
return isMatchedCase(data) ? 'selectablematch' : 'selectable')
)}
}
我认为这应该会让你朝着正确的方向前进。