From d48616adb55b91da0bb2d1b819219a513fcb3431 Mon Sep 17 00:00:00 2001 From: Tomas Kirda Date: Wed, 24 Apr 2013 15:48:05 -0500 Subject: [PATCH] Construct serviceUrl via callback function. Fixes #66. --- spec/autocompleteBehavior.js | 36 ++++++++++++++++++++++++++++++++++++ src/jquery.autocomplete.js | 10 +++++++--- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/spec/autocompleteBehavior.js b/spec/autocompleteBehavior.js index e3f4e84..64822ca 100644 --- a/spec/autocompleteBehavior.js +++ b/spec/autocompleteBehavior.js @@ -385,4 +385,40 @@ describe('Autocomplete', function () { expect(instance instanceof $.Autocomplete).toBe(true); }); + + it('Should construct serviceUrl via callback function.', function () { + var input = $(document.createElement('input')), + dynamicUrl, + data; + + input.autocomplete({ + ignoreParams: true, + serviceUrl: function (query) { + return '/dynamic-url/' + encodeURIComponent(query).replace(/%20/g, "+"); + } + }); + + $.mockjax({ + url: '/dynamic-url/*', + responseTime: 5, + response: function (settings) { + dynamicUrl = settings.url; + data = settings.data; + var response = { + suggestions: [] + }; + this.responseText = JSON.stringify(response); + } + }); + + input.val('Hello World'); + input.autocomplete().onValueChange(); + + waits(10); + + runs(function () { + expect(dynamicUrl).toBe('/dynamic-url/Hello+World'); + expect(data).toBeFalsy(); + }); + }); }); \ No newline at end of file diff --git a/src/jquery.autocomplete.js b/src/jquery.autocomplete.js index 7c6d374..e30a89f 100644 --- a/src/jquery.autocomplete.js +++ b/src/jquery.autocomplete.js @@ -381,7 +381,8 @@ getSuggestions: function (q) { var response, that = this, - options = that.options; + options = that.options, + serviceUrl = options.serviceUrl; response = that.isLocal ? that.getSuggestionsLocal(q) : that.cachedResponse[q]; @@ -393,9 +394,12 @@ if (options.onSearchStart.call(that.element, options.params) === false) { return; } + if ($.isFunction(options.serviceUrl)) { + serviceUrl = options.serviceUrl.call(that.element, q); + } $.ajax({ - url: options.serviceUrl, - data: options.params, + url: serviceUrl, + data: options.ignoreParams ? null : options.params, type: options.type, dataType: options.dataType }).done(function (data) {