简体   繁体   中英

Bootstrap-3 Meteor event on radio buttons

So I'm trying to get the event click on radio buttons (meteor).

I'm doing in the template events (client js file):

Template.Questions.events({
 'click #public_btn' : function (){
  console.log('1');
  // something
 },

 'click #private_btn' : function (){
  console.log('2');
  // something
 }

and in the html client file I have the radio buttons:

<div class="btn-group" data-toggle="buttons">
    <label class="btn btn-primary active">
      <input type="radio" name="privacy_options" value="public" id="public_btn"> Public
    </label>
    <label class="btn btn-primary">
      <input type="radio" name="privacy_options" value="private" id="private_btn"> Private
    </label>
  </div>

The thing is the click event does not fire as long ad the div got the data-toggle="buttons"

Is there a way to fox this ?

Note, that as of Meteor 0.8, Template events will work correctly with jQuery triggered events.

So the correct solution will be just binding to the change event:

Template.Questions.events({
  'change #public_btn' : function (){
   console.log('1');
  // something
 },

'change #private_btn' : function (){
   console.log('2');
   // something
}

First up, the event will actually be the change event on the input:radio (not click at the time of writing)

Second of all, Meteor (0.7.0) uses it's own events engine, which wont catch jQuery triggered events eg. $(element).trigger('change')

If you take a look at the bootstrap source it shows that the toggle buttons fires a jQuery / synthetic event.

So you need to bind jQuery event handlers, the most efficient way that I've found, is to do it on template creation - but based off document.body rather than the actual element - as it will be replaced on each render.

Template.Questions.created = function(){
  // must bind to `document.body` as element will be replaced during re-renders
  // add the namespace `.tplquestions` so all event handlers can be removed easily
  $(document.body).on('change.tplquestions', '#public_btn', function(e){
     // handler
  });
  // add the namespace `.tplquestions` so all event handlers can be removed easily
  $(document.body).on('change.tplquestions', '#private_btn', function(e){
     // handler
  });
 };
 Template.Questions.destroyed = function(){
   // remove all event handlers in the namespace `.tplquestions`
   $(document.body).off('.tplquestions');
 }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM