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

の知る限り、ノックアウト検証はこのようには機能しません。無効な値を入れて、それが有効かどうかを教えてくれます。

アップデート:

次のエクステンダーを追加しましたが、何もしないようです (name.attempt is undefined が表示されます)。

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
4

1 に答える 1

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のデモ。

于 2013-04-23T05:44:39.327 に答える