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: @ 

같은 기능을 더 재사용 가능하게 만들고 싶습니다. 'lastInvalid'및 'attempt'메소드를 추가하기 위해 ko.observable 객체를 확장하는 방법이 있습니까? 같은

뭔가 : 다음

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

그리고 할 수있을 :

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

AFAIK knockout-validation이 방법을 작동하지 않습니다. 유효하지 않은 값을 넣은 다음 유효한지 여부를 알려줍니다.

는 업데이트 :

나는 다음과 같은 확장을 추가하지만 (나는 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() 

데모 JSFiddle.

+0

오, 얼마나 많은 시간을 낭비했는지 -> – Manuel

관련 문제