2012-12-10 7 views
5

Rivets.jsを使用してモデルに要素をバインドしています。私はデザインでTwitterのBootstrapを使用していて、1、2、3の値(機能的にラジオボタンに相当)から3つのボタンを選択して設定しています。Backbone.jsでRivets.jsでカスタムバインダーを使用しているときにボタンに「ラジオ」機能を追加する

私はこのようなボタングループ内の三つのボタンを設定している:

<div class="btn-group" id="input_level" data-toggle="model.level"> 
    <button data-toggle-value="1" class="btn active">One</button> 
    <button data-toggle-value="2" class="btn">Two</button> 
    <button data-toggle-value="3" class="btn">Three</button> 
</div> 

私はそうのようなカスタムtoggleバインダー追加しました:それが必要のよう

rivets.binders.toggle = function(el,value){ 
    $(el).find('button[data-toggle-value="' + value + '"]') 
     .addClass('active').siblings().removeClass('active'); 
} 

これは、ボタンの状態を更新し、それ以外の方法では動作しません。つまり、ボタンクリックイベントにバインドされたイベントはありません。これを一般化してRivets.jsにしたいので、バックボーンビューのフォームの各ボタングループにクリックイベントを追加する必要はありません。

リベッツのこの基本機能はありますか?もしそうなら、どうすれば設定できますか?

答えて

4

はRivets.js注釈付きソースを学んだ後、私は(私はCoffeeScriptのを使用していないので、それは読んで手間のビットだった)、しばらくして解決策を見つけた:

私は、元のこの部分を置き換え私の質問のコード:これにより

rivets.binders.toggle = function(el,value){ 
    $(el).find('button[data-toggle-value="' + value + '"]') 
     .addClass('active').siblings().removeClass('active'); 
} 

rivets.binders.toggle = { 
    publishes: true, 
    bind: function(el){ 
     $(el).on('click', 'button:not(.active)', _.bind(function(e){ 
      this.model.set(this.keypath, $(e.currentTarget).data('toggle-value')); 
     }, this)); 
    }, 
    unbind: function(el){ 
     $(el).off('click', 'button:not(.active)'); 
    }, 
    routine: function(el,value){ 
     $(el).find('button[data-toggle-value="' + value + '"]') 
      .addClass('active').siblings().removeClass('active'); 
    } 
}; 

初期コードがrivets.binders.toggle.routine代わりのrivets.binders.toggle中です。

+1

これを解決するためのより良い方法についてのご意見は歓迎します。 – Nils

+1

非常に有用なバインダーの例。ありがとうございました。 – SpyBot

関連する問題