2

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'));
        }
    });
});
4

1 に答える 1

2

// Backbone JS を使用した jQuery Autocomplete Pluginからの疑似コード

var MyView = Backbone.View.extend({
initialize: function () {
    this.myCollection = new MyCollection();

},
events: {
    'focus #names': 'getAutocomplete',
    'keydown #names':'invokefetch'
},
invokefetch : function(){
   this.myCollection.fetch(); 
   $("#names").unbind( "keydown", invokefetch);
},    
getAutocomplete: function () {
    $("#names").autocomplete({
        source: JSON.stringify(this.myCollection)
    });
}

});

EDIT-20120711---------これはどうですか:

//疑似コード ...

// View1 (view using the module autocomplete)
define([
    'autoCompleteModule'
], function (autoCompleteModule) {
    var MyView = Backbone.View.extend({

        events: {
            'keydown #names': 'getAutocomplete'
        },
        getAutocomplete: function (e) {
            var el = $('#names');
            if(!el.data){
                autoCompleteModule(el);
            }
        }
    });
});
于 2012-07-10T22:23:29.480 に答える