|
$(document).on lets you keep your javascript source files relatively flat because the event handler listens on the document, rather than an individual element. So even if the element is not currently on the page (loaded in via AJAX for example) the $(document).on handler will still pick it up. You never need to bind or unbind event handlers manually. The rails recommended way is to respond to the JS format and do server-rendered javascript.... but I tend to prefer using a simple data-transport-only (JSON) api, then do the client stuff on the client side. Simple example: $(document).on 'ajax:success', '.guest-form', ->
notify 'success', 'Guest updated.'
$(@).parents('.modal').modal 'hide'
$(document).ajaxError (event, jqxhr, settings, thrownError) ->
handle_ajax_error(event, jqxhr)
@handle_ajax_error = (error, xhr) ->
if xhr.status is 422
error = JSON.parse(xhr.responseText)['errors']
notify 'error', error
else if xhr.status is 500
notify 'error', 'Error communicating with the server. We have been notified.'
if xhr.status is 401
notify 'warning', 'Session has expired. Redirecting to login...'
window.location = '/login'
if xhr.status is 403
window.location = '/access-denied'
So if you load in content via AJAX (I do this a lot for table views of data and the user wants to see a single record), rather than go to a separate page, I do an ajax call, put the result into a Twitter bootstrap modal, show the modal, and when the bs.modal.shown event fires, that "single javascript function" with the modal as the parameter is called, and it initializes all the javascript needed for that particular DOM container.Example: $(document).on 'shown.bs.modal', 'a[data-toggle="tab"]', (e) ->
$modal_body = $( $(e.target).attr('href') )
general_init $modal_body
The general_init function will initialize all my selectize elements (among other things) as such: general_init = ($container) ->
add_selectize $container.find('input.membership-plan-select'), $.extend(true, {}, Selects.MembershipPlanOptions)
So when writing forms, lets say to create a new "Event Ticket" I simply plop in a text field with a class of "guest-select" and I instantly have an AJAX powered search field to find/create a guest to assign that ticket to. |