2012-01-19 14 views
3

バインディングが存在しない可能性のあるカスタムバインディングをたくさん扱う良い方法とは何でしょうか? 私のhtml表現は以下のようにimage_urlにバインドされているとします。カスタムバインディングのノックアウトjs多くの

<span title="Company Logo" data-bind="image_url: company_banner"></span> 

ただし、image_urlバインディングが使用できない可能性があります。 その場合、company_bannerの文字列値を返すだけです。

通常、以下のようなカスタムハンドラを追加しますが、そのハンドラが利用できない場合、一般的なフィードバックを返すことができますか?我々の場合には

ko.bindingHandlers.buttonLabel = {//update etc} 

デザインは、先にコードのかもしれので、我々がkoが不平を言う必要はありません。

+0

非常に良い質問、残念ながら答えを持っていません。しかし、私はあなたがそこで何かできるかどうかを見るためにkoライブラリのbindingHandlersオブジェクトを詳細に解剖したいと思うと思います。しかし助けてもらえませんでしたが、非常に実用的で良い質問がありました。 – Vin

+0

@Vin、はい、ちょうどkoのデバッグバージョンをダウンロードしました。私はそれをクラックすると投稿します。 – Chin

+0

@Vin、それを見て。幸いにも誰か – Chin

答えて

6

このシナリオでは、カスタムバインディングプロバイダを使用します。ここに機能を説明する記事があります:http://www.knockmeout.net/2011/09/ko-13-preview-part-2-custom-binding.html

したがって、私は実際のバインディングプロバイダへのラッパーであるカスタムバインディングプロバイダを作成します。バインディングが解析されると、それらが存在するかどうかを調べて、ko.bindingHandlersにあるかどうかを調べることができます。そうでない場合は、その値を持つテキストバインディングを追加できます。

それは次のようになります。ここでは

ko.lenientBindingProvider = function() { 
    var realBindingProvider = new ko.bindingProvider(); 

    this.nodeHasBindings = realBindingProvider.nodeHasBindings; 

    this.getBindings = function(node, bindingContext) { 
     //parse the bindings with the real binding provider 
     var result = realBindingProvider.getBindings(node, bindingContext); 

     //inspect the returned bindings 
     for (var binding in result) { 
      if (result.hasOwnProperty(binding) && binding !== "_ko_property_writers" && !ko.bindingHandlers[binding]) { 
       //add a text binding with whatever the missing binding was bound against 
       result.text = result[binding]; 
      } 
     } 

     return result; 
    }; 
}; 

ko.bindingProvider.instance = new ko.lenientBindingProvider(); 

サンプルです:http://jsfiddle.net/rniemeyer/mMQKY/

関連する問題