jQueryUi.autocomplete
からソースを取得するモジュールを作成するために使用したいとしましょうbackboneCollection
。
autocomplete モジュールには次のコード (1) を実装し
、Backbone.view には次のコード (2) を実装します。
ユーザーが文字を入力していないときにもコレクションのフェッチが実行されるため、実際には好きではありません。
ユーザーが入力ボックスに何かを入力し始めたときにのみ、fetching collection
またはを実行するにはどうすればよいですか?source function
PS: Backbone JS を使用した jQuery Autocomplete Plugin
に関する同様の質問を既に投稿しましたが、 aoutocomplete モジュールのニーズは異なるビュー間で共有される可能性があるため、コレクションのフェッチを autocomplete モジュールに移動することにしました。
(1)
/*global define */
define([
'users',
'jquery',
'jqueryUi'
], function (UserCollection, $) {
"use strict";
var autoComplete = function(element) {
var userCollection,
data;
userCollection = new UserCollection();
userCollection.fetch();
data = userCollection.toJSON();
element.autocomplete({
minLength: 3,
source: function(request, response) {
var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
response($.grep(data, function(value) {
return matcher.test(value.name);
}));
},
create: function() {
element.val(data.name);
},
focus: function(event, ui) {
element.val(ui.item.name);
return false;
},
select: function(event, ui) {
element.val(ui.item.name);
return false;
}
}).data('autocomplete')._renderItem = function(ul, item) {
return $('<li></li>')
.data('item.autocomplete', item)
.append('<a><img src="' + item.avatar + '" />' + item.name + '<br></a>')
.appendTo(ul);
};
};
return autoComplete;
});
(2)
// View1 (view using the module autocomplete)
define([
'autoCompleteModule'
], function (autoCompleteModule) {
var MyView = Backbone.View.extend({
events: {
'focus #names': 'getAutocomplete'
},
getAutocomplete: function (e) {
autoCompleteModule($('#names'));
}
});
});