1

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

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» и «попытка»?

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

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

А потом быть в состоянии сделать:

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

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

Update:

Я добавил следующий расширитель, но это, кажется, не делать ничего (я получаю 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. Потому что, когда вы хотите, чтобы обеспечить чтение, запись функции к вычисленным вам необходимо предоставить объект буквальным, а не функцию:

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() 

Demo JSFiddle.

+0

О, сколько времени впустую из-за этого -> – Manuel

Смежные вопросы