2012-03-07 17 views
12

私は最近、データバインド構文を使用してJQuery検証プラグインをフォームに組み込むためのバインディングハンドラを作成しました。ハンドラに複数の情報を提供する必要があることがわかりました。バリデーションを実行するためのフラグと、バリデーションが成功すると呼び出すコールバックを提供する必要がありました。ノックアウトカスタムバインディングハンドラ - 複数の引数と関数コールバックがベストプラクティスですか?

質問:

  1. 複数の引数を供給するためのベストプラクティスは何ですか?私はオブジェクト表記の構文に頼っていましたが、別のバインディングを提供して、そのハンドラに渡された "allBindings"パラメータでバインディングをチェックすることもできます...

  2. ハンドラにコールバック関数を提供するためのベストプラクティス?以下は

ハンドラ適用するハンドラとhtmlコードを定義するJSコードです:使用しているとき、あなたの質問の両方、強くお勧めを答えるために

 <form id="step1" 
     data-bind="jqValidation:{enforce: true, 
           submitHandler: doSomethingInVM}"> 
      <fieldset data-bind="with:searchRequest"> 
      //fields 
      </fieldset> 
      <button type="submit">submit</button> 
    </form> 

 ko.bindingHandlers.jqValidation = { 

     update: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
      var accessor = valueAccessor(); 
      //need unwrapobservable?? 
      if (accessor.enforce) { 
       $(element).find(':submit').removeClass('cancel'); 
       $(element).validate({ 
        submitHandler: function() { 
         if ($.isFunction(accessor.submitHandler)) 
          accessor.submitHandler(); 
        } 
       }); 
      } else 
       $(element).find(':submit').addClass('cancel'); 
     } 
    }; 

答えて

0

をknockoutjsとMVVMパターンは、それぞれのビューモデルでオブジェクトに関連するプロパティとメソッドをカプセル化することです。

しかし、ビューモデルの更新(またはビューモデルの変更による他のオブジェクトへの更新のトリガー)を担う任意のプロパティ(引数があれば)とコールバックメソッドは非常にうまく動作しますビューモデルそのもの。

カスタムバインディングハンドラの内部では、必要なプロパティをビューモデルから直接参照するだけでなく、ビューモデルに存在するコールバック関数を呼び出すこともできます。

このようにメンバーとビヘイビアをカプセル化すると、各ビューモデルを単体テストするのが非常に簡単になります。

8

あなたのアプローチは、KO自身が使用しているパターンに従っているので、完全に有効だと思います。 allBindingsAccessorを使用することもできます。私は、このメソッドの使用法を解釈してきた方法は、例えばbubbleEventは、他のは、そのイベントを扱っていないバブルにそれらを結合することを示すために使用することができバインディング、複数のバインディング間

  1. に共有プロパティです。
  2. 複雑なバインディングハンドラが他のバインディングを認識し、動作を調整できるようにする。

ハンドラを渡すためのベストプラクティスは、バインディングのインラインではなく、ビューモデルの名前付きメンバとして持つことです。

+0

ありがとう、それはallBindingsAccessorメソッドについての私の考えでした。したがって、私の場合は、データバインド属性にハンドラを渡しませんか? – drogon

+0

私は、あなたが行ったのと全く同じように、VMの参照元オブジェクトの一部として渡します。あなたはまた、醜いと悪い練習と見なされるインラインでハンドラを書くことができます。 – madcapnmckay

+0

ああ、私は同意する、私は私の最初の恋愛プロジェクトのそれらのいくつかの有罪だ:) – drogon

関連する問題