淘汰赛的可重复使用的属性验证

时间:2013-04-23 02:46:14

标签: javascript knockout.js coffeescript knockout-validation

我有以下类来验证名称,并且不允许用户输入空名称。有了它,我可以获得有效值,并通知用户输入是否无效(保留最后一个好的值)。

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 个答案:

答案 0 :(得分:1)

由于->定义中有额外的attempt,因此扩展程序偏袒不起作用。因为当你想为计算机提供读,写函数时,你需要提供一个对象文字,而不是一个函数:

target.attempt = ko.computed
    read: target
    write: (value) ->
      if value.length > 0
        target value
        target.lastInvalid false
      else
        target.lastInvalid true
  target

您尝试从基础值访问其他属性,而不是从observable本身访问。所以你需要写:

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

演示JSFiddle