是否可以在 Knockout 中访问 $(this) 并执行诸如 hide() 或 toggle() this div 之类的操作?
是的,但你不应该那样做。
任何 jQuery 代码(除了$.ajax()
实用程序函数)和任何其他进行 DOM 交互的代码(修改、遍历、事件处理、样式更改)都应该完全远离您的视图模型和视图。
- 您的 viewmodel 管理您的应用程序的状态,而不是它的外观。
- 管理应用程序外观的方法是将视图模型属性绑定到视图属性。
- 视图应该完全依赖于视图模型,但视图模型应该对视图具有零依赖。
- 在视图模型中添加调用 jQuery
.hide()
的代码会引入对视图模型内部视图的依赖。假设你改变了你的观点并且.hide()
不再是正确的事情。现在您还必须更改视图模型 - 无需添加任何实际功能。
- 在视图中添加调用 jQuery
.hide()
的代码会使视图模型内部的状态在关于事物显示方式的更改方面处于黑暗状态。你失去了对视图模型外观的控制,并逐渐被迫添加更多这样的技巧。
- 使用现有绑定(绑定所有基本交互,如显示或隐藏元素、添加事件处理程序、与表单元素交互)或为特殊行为编写新绑定。
所以在你的情况下,你需要的是
- 一个 viewmodel 属性,用于跟踪项目是否应该可见
- 设置此属性的函数
- 绑定_
visible
在对话框的情况下,让我们调用该属性isVisible
并让它默认为true
.
视图模型:
function Alert() {
var self = this;
self.isVisible = ko.observable(true);
self.message = ko.observable("some text here");
self.dismiss = function () { self.isVisible(false); };
}
视图,为易读而包装:
<div
data-bind="
text: message,
click: dismiss,
visible: isVisible,
text: message
"
class="alert alert-secondary alert-dismissible fade show"
role="alert"
></div>