2013-04-23 47 views
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'和'attempt'方法?

喜歡的東西:

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 2013-04-23 13:30:22