I am in the process of learning Backbone.js. I currently assume that if one is using Backbone.js then all client-side javascript/jQuery should be integrated with Backbone. From
I'm using autocomplete to enhance "locality" fields in many form views which interact with different models and different search apis.
In this case I feel that "autocomplete locality" is a "behavior" of the field, rather than a view itself and to keep it DRY I implement it this way:
Here is some coffeescript extracts (I'm also using requirejs and the awesome jquery-ui amd wrapper at https://github.com/jrburke/jqueryui-amd)
The LocalityAutocompleteBehavior :
define [
'jquery'
#indirect ref via $, wrapped by jqueryui-amd
'jqueryui/autocomplete'
], ($) ->
class LocalityAutocompleteBehavior
#this applies the behavior to the jQueryObj and uses the model for
#communication by means of events and attributes for the data
apply: (model, jQueryObj) ->
jQueryObj.autocomplete
select: (event, ui) ->
#populate the model with namespaced autocomplete data
#(my models extend Backbone.NestedModel at
# https://github.com/afeld/backbone-nested)
model.set 'autocompleteLocality',
geonameId: ui.item.id
name: ui.item.value
latitude: ui.item.latitude
longitude: ui.item.longitude
#trigger a custom event if you want other artifacts to react
#upon autocompletion
model.trigger('behavior:autocomplete.locality.done')
source: (request, response) ->
#straightforward implementation (mine actually uses a local cache
#that I stripped off)
$.ajax
url: 'http://api.whatever.com/search/destination'
dataType:"json"
data:request
success: (data) ->
response(data)
#return an instanciated autocomplete to keep the cache alive
return new LocalityAutocompleteBehavior()
And an extract of a view using this behavior :
define [
'jquery'
#if you're using requirejs and handlebars you should check out
#https://github.com/SlexAxton/require-handlebars-plugin
'hbs!modules/search/templates/SearchActivityFormTemplate'
#model dependencies
'modules/search/models/SearchRequest'
#autocomplete behavior for the locality field
'modules/core/behaviors/LocalityAutocompleteBehavior'
], ($, FormTemplate, SearchRequest, LocalityAutocompleteBehavior ) ->
#SearchFormView handles common stuff like searching upon 'enter' keyup,
#click on '.search', etc...
class SearchActivityFormView extends SearchFormView
template: FormTemplate
#I like to keep refs to the jQuery object my views use often
$term: undefined
$locality: undefined
initialize: ->
@render()
render: =>
#render the search form
@$el.html(@template())
#initialize the refs to the inputs we'll use later on
@$term = @$('input.term')
@$locality = @$('input.locality')
#Apply the locality autocomplete behavior to the form field 'locality'
LocalityAutocompleteBehavior.apply(@model, @$locality)
#return this view as a common practice to allow for chaining
@
search: =>
#A search is just an update to the 'query' attribute of the SearchRequest
#model which will perform a 'fetch' on 'change:query', and I have a result
#view using using the same model that will render on 'change:results'...
#I love Backbone :-D
@model.setQuery {term: @$term.val(), locality: @$locality.val()}