Можно ли установить существующие привязки Knockout в пользовательской привязке?

В настоящее время все мои ярлыки выглядят примерно так:

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

person 4imble    schedule 08.04.2014    source источник
comment
Прочитав пост, я склонился к использованию шаблона для меток. Предполагая, что FirstName является наблюдаемым, передайте его вместе с меткой, которую вы хотите использовать, в шаблон и используйте версию динамического класса привязки css. См. скрипку.   -  person Origineil    schedule 09.04.2014


Ответы (2)


Вы можете вызывать встроенные привязки из своих собственных. Что-то вроде этого должно работать в вашем методе обновления, чтобы заменить ваш код jQuery:

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

Связанный вопрос с более подробной информацией: Могу ли я создать пользовательскую привязку, которая использует другие привязки в Knockout.js

person Charlie    schedule 08.04.2014

Правильный подход - использовать ko.applyBindingsToNode

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

Таким образом, он будет правильно подключать привязки, а не просто вызывать метод обновления. Его следует вызывать из функции инициализации вашей пользовательской привязки. Не каждое обновление

person Anders    schedule 09.04.2014