2

我目前的所有标签看起来像这样:

<label data-bind="css: { notdone: FirstName.isModified() && !FirstName.isValid(),
       done: FirstName.isModified() && FirstName.isValid() }">FirstName</label>

我想创建一个自定义绑定来提取标签中的重复项,而无需重新实现 CSS 绑定。

我可以在自定义绑定中使用 CSS 绑定吗?

如果没有,那么我将重新发明轮子,以消除一些重复,如下所示:

ko.bindingHandlers.validationLabel =
{
  update: (element, valueAccessor) =>
  {
      var value = valueAccessor();
      var isModified = value.isModified();
      var isValid = value.isValid();

      $(element).removeClass("done notdone");

      if (!isModified)
          return;

      $(element).addClass(isValid ? "done" : "notdone");
  }
}
4

2 回答 2

2

您可以从自己的内部调用内置绑定。像这样的东西应该在您的更新方法中工作以替换您的 jQuery 代码:

ko.bindingHandlers.css.update(element, function() {
    return { done: isValid, notdone: !isValid }
});

更多详细信息的相关问题:我可以创建一个自定义绑定,它在 knockout.js 中使用其他绑定

于 2014-04-08T20:06:43.260 回答
1

正确的做法是使用ko.applyBindingsToNode

var notValid = ko.computed(function() {
   return !isValid();
});
ko.applyBindingsToNode(element, { done: isValid, notdone: notValid });

这样,它将正确连接绑定,而不仅仅是调用更新方法。它应该从自定义绑定的 init 函数中调用。不是每次更新

于 2014-04-09T08:38:37.343 回答