你能在自定义绑定中设置现有的Knockout绑定吗?

时间:2014-04-08 14:16:39

标签: knockout.js custom-binding knockout-3.0

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

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

2 个答案:

答案 0 :(得分:2)

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

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

相关问题及更多详情:Can I create a custom binding that uses other bindings in knockout.js

答案 1 :(得分:1)

正确的方法是使用ko.applyBindingsToNode

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

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