带有句柄的敲除绑定到模板化元素

Knockout binding with a handle to templated element

Knockout 非常棒,但我对如何在生成 DOM 元素后对其进行处理感到有点困惑。例如,我有一组用户。每个用户都有一个Id:

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

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

<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"); 
});

一旦我达到的用户目标可能会有所不同(跨度或 div),我需要确保我得到了正确的 div。此外 e.target 不适用于 "not a fucntion" 错误。

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

你应该使用 the click binding in conjunction with the 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:不要t。如果绝对必要,您可能需要一个 custom binding handler,就像您在 "that other" 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>