2013-04-23 45 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