Permalink
Browse files

Fixed broken callback, and the default value for chosenOptions should…

… be an object rather than a function
  • Loading branch information...
1 parent cd97514 commit 18e593e1d5fbaa183f43dea76af4bfadcf8a960f @fredwu fredwu committed Feb 8, 2013
Showing with 28 additions and 32 deletions.
  1. +2 −5 lib/ajax-chosen.js
  2. +2 −3 lib/ajax-chosen.min.js
  3. +24 −24 src/ajax-chosen.coffee
View
Oops, something went wrong.
Oops, something went wrong.
@@ -1,6 +1,6 @@
do ($ = jQuery) ->
- $.fn.ajaxChosen = (settings = {}, callback = {}, chosenOptions = ->) ->
+ $.fn.ajaxChosen = (settings = {}, callback, chosenOptions = {}) ->
defaultOptions =
minTermLength: 3
afterTypeDelay: 500
@@ -10,17 +10,17 @@ do ($ = jQuery) ->
# This will come in handy later.
select = @
-
+
chosenXhr = null
-
+
# Merge options with defaults
options = $.extend {}, defaultOptions, $(select).data(), settings
# Load chosen. To make things clear, I have taken the liberty
# of using the .chzn-autoselect class to specify input elements
# we want to use with ajax autocomplete.
@chosen(if chosenOptions then chosenOptions else {})
-
+
@each ->
# Now that chosen is loaded normally, we can bootstrap it with
# our ajax autocomplete code.
@@ -29,7 +29,7 @@ do ($ = jQuery) ->
.bind 'keyup', ->
# This code will be executed every time the user types a letter
# into the input form that chosen has created
-
+
# Retrieve the current value of the input form
untrimmed_val = $(@).val()
val = $.trim $(@).val()
@@ -38,61 +38,61 @@ do ($ = jQuery) ->
# if they need to keep typing or if we are looking for their data
msg = if val.length < options.minTermLength then options.keepTypingMsg else options.lookingForMsg + " '#{val}'"
select.next('.chzn-container').find('.no-results').text(msg)
-
+
# If input text has not changed ... do nothing
return false if val is $(@).data('prevVal')
# Set the current search term so we don't execute the ajax call if
# the user hits a key that isn't an input letter/number/symbol
$(@).data('prevVal', val)
-
+
# At this point, we have a new term/query ... the old timer
# is no longer valid. Clear it.
# We delay searches by a small amount so that we don't flood the
# server with ajax requests.
clearTimeout(@timer) if @timer
-
+
# Some simple validation so we don't make excess ajax calls. I am
# assuming you don't want to perform a search with less than 3
# characters.
return false if val.length < options.minTermLength
-
+
# This is a useful reference for later
field = $(@)
-
+
# Default term key is `term`. Specify alternative in options.options.jsonTermKey
options.data = {} if not options.data?
options.data[options.jsonTermKey] = val
- options.data = options.dataCallback(options.data) if options.dataCallback?
-
+ options.data = options.dataCallback(options.data) if options.dataCallback?
+
# If the user provided an ajax success callback, store it so we can
# call it after our bootstrapping is finished.
success = options.success
-
+
# Create our own callback that will be executed when the ajax call is
# finished.
options.success = (data) ->
# Exit if the data we're given is invalid
return if not data?
-
+
# Go through all of the <option> elements in the <select> and remove
# ones that have not been selected by the user. For those selected
# by the user, add them to a list to filter from the results later.
selected_values = []
- select.find('option').each ->
+ select.find('option').each ->
if not $(@).is(":selected")
$(@).remove()
else
selected_values.push $(@).val() + "-" + $(@).text()
select.find('optgroup:empty').each ->
$(@).remove()
-
+
# Send the ajax results to the user callback so we can get an object of
# value => text pairs to inject as <option> elements.
- items = callback data
-
+ items = if callback? then callback(data) else data
+
nbItems = 0
@@ -151,19 +151,19 @@ do ($ = jQuery) ->
field.val(untrimmed_val)
# Because non-ajax Chosen isn't constantly re-building results, when it
- # DOES rebuild results (during liszt:updated above, it clears the input
- # search field before scaling it. This causes the input field width to be
- # at it's minimum, which is about 25px.
+ # DOES rebuild results (during liszt:updated above, it clears the input
+ # search field before scaling it. This causes the input field width to be
+ # at it's minimum, which is about 25px.
# The proper way to fix this would be create a new method in chosen for
- # rebuilding results without clearing the input field. Or to call
+ # rebuilding results without clearing the input field. Or to call
# Chosen.search_field_scale() after resetting the value above. This isn't
# possible with the current state of Chosen. The quick fix is to simply reset
# the width of the field after we reset the value of the input text.
# field.css('width','auto')
-
+
# Execute the ajax call to search for autocomplete data with a timer
- @timer = setTimeout ->
+ @timer = setTimeout ->
chosenXhr.abort() if chosenXhr
chosenXhr = $.ajax(options)
, options.afterTypeDelay

0 comments on commit 18e593e

Please sign in to comment.