javascript - 带有模板化元素句柄的 knockout 绑定(bind)

标签 javascript jquery html knockout.js knockout-3.0

Knockout 非常棒,但我对生成 DOM 元素后如何处理它们感到有点困惑。例如,我有一个用户集合。每个用户都有一个 ID:

var user = {
   id : 123,
   name : 'testUser',
   age: 45
};

使用 Knockout,我将上述数据结构的集合与以下 html 模板绑定(bind):

<div data-bind="foreach: users">
 <div class='user-wrapper'>
   <span data-bind="text: name"></span>
   <span data-bind="text: age"></span>
 </div>
</div>

现在我想在用户点击时更改背景颜色:

$(".user-wrapper").click(function (e) {
   //doesn't work - toggelClass is not a function
   e.target.toggleClass("user-selected"); 
});

一旦我遇到的用户目标可能不同(span 或 div),我需要确保我获得了正确的 div。此外,e.target 不适用于“不是函数”错误。

如何访问调用元素来切换类? 如何获取该元素的用户 ID 来访问与该 ID 相关的其他控件?

最佳答案

您应该使用the click bindingthe css binding 结合使用:

<div data-bind="foreach: users">
 <div class='user-wrapper' data-bind="click: toggleSelected, css: { 'user-selected': isSelected }">
   <span data-bind="text: name"></span>
   <span data-bind="text: age"></span>
 </div>
</div>

请注意,如果您在使用 KnockoutJS(或一般的客户端 MVVM 库)时想使用 jQuery 来操作 DOM:不要。如果您绝对必须,您可能需要 custom binding handler ,就像您在“另一个”mvvm 框架中使用指令进行 DOM 操作一样。


这是一个演示:

var user = {
   id : 123,
   name : 'testUser',
   age: 45
};

var UserVm = function(data) {
  var self = this;
  
  self.name = data.name;
  self.age = data.age;
  
  self.isSelected = ko.observable(false);
  
  self.toggleSelected = function() {
    self.isSelected(!self.isSelected());
  }
};

ko.applyBindings({ users: [new UserVm(user)] });
.user-selected { background-color: red; }
.user-wrapper:hover { cursor: pointer; background-color: pink; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<div data-bind="foreach: users">
 <div class='user-wrapper' data-bind="click: toggleSelected, css: { 'user-selected': isSelected }">
   <span data-bind="text: name"></span>
   <span data-bind="text: age"></span>
 </div>
</div>

关于javascript - 带有模板化元素句柄的 knockout 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32677492/

相关文章:

javascript - Puppeteer - 如何选择带有类名的 div 内的 A 标签

javascript - 将 javascript 双按位转换为 C#

javascript - 如何将 jQuery 中的值与固定数字进行比较?

javascript - 如何跟踪/排除 <div> 或 <class> 属性的故障?

html - 如果屏幕不够宽,如何使用 CSS 有条件地调整图像大小?

javascript - 如何使用 Ajax 成功在新选项卡中打开 URL?

javascript - 图像元素 'clear' 背景颜色不起作用

javascript - React/Flux 和 xhr/路由/缓存

javascript - 为什么 getScript 不能从外部脚本运行?

jQuery 检查元素以确保没有焦点