Повторная проверка свойства с нокаутом
У меня есть следующий класс, который проверяет имя и не позволяет пользователю вводить пустое имя. С его помощью я могу получить действительное значение и уведомить пользователя, если ввод недопустим (сохраняя последнее правильное значение).
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.