Повторная проверка свойства с нокаутом

У меня есть следующий класс, который проверяет имя и не позволяет пользователю вводить пустое имя. С его помощью я могу получить действительное значение и уведомить пользователя, если ввод недопустим (сохраняя последнее правильное значение).

class @Person
  constructor: (name) ->
    @name = ko.observable name
    @nameLastInvalid = ko.observable false
    @nameAttempt = ko.computed
      read: @name
      write: (value) =>
        if value.length > 0
          @name value
          @nameLastInvalid false
        else
          @nameLastInvalid true
      owner: @

Я хочу сделать ту же функциональность более пригодной для повторного использования. Есть ли способ расширить объект ko.observable, чтобы добавить методы 'lastInvalid' и 'try'?

Что-то вроде:

class @Person
  constructor: (name) ->
    @name = ko.observable(name).extend({ required: true })

И тогда сможете сделать:

person.name()
person.name().lastInvalid()
person.name().attempt()

AFAIK нокаут-проверка не работает таким образом. Он позволяет вам указать недопустимое значение, а затем сообщает вам, действительно ли это значение или нет.

Обновить:

Я добавил следующий расширитель, но он, похоже, ничего не делает (я получаю name.attempt не определено)

ko.extenders.required = (target, option) ->
  target.lastInvalid = ko.observable false
  target.attempt = ko.computed ->
    read: target
    write: (value) ->
      if value.length > 0
        target value
        target.lastInvalid false
      else
        target.lastInvalid true
  target

1 ответ

Решение

Ваш экстендер не работает, потому что у вас есть дополнительный -> в attempt определение. Потому что, когда вы хотите предоставить функцию read, write для вычисляемой, вам нужно предоставить литерал объекта, а не функцию:

target.attempt = ko.computed
    read: target
    write: (value) ->
      if value.length > 0
        target value
        target.lastInvalid false
      else
        target.lastInvalid true
  target

И вы пытаетесь получить доступ к дополнительным свойствам из базового значения, а не из самого наблюдаемого. Так что вам нужно написать:

person.name()
person.name.lastInvalid()
person.name.attempt()

Демо JSFiddle.

Другие вопросы по тегам