3

フォームを持つbackboneViewでオートコンプリートを実装するためにjQueryUiを使用したいとします。

次のコード(*)を実装しましたが、ユーザーが文字を入力しなかった場合にもコレクションのフェッチが実行されるため、これは好きではありません。

ユーザーが入力ボックスに何かを入力し始めたときにのみ、コレクションのフェッチを実行するにはどうすればよいですか?

var MyView = Backbone.View.extend({
    initialize: function () {
        this.myCollection = new MyCollection();
        this.myCollection.fetch(); // I would like to fetch the collection 
                                   // only when the user start to type the first letter  
    },
    events: {
        'focus #names': 'getAutocomplete'
    },

    getAutocomplete: function () {
        $("#names").autocomplete({
            source: JSON.stringify(this.myCollection)
        });
    }
});

PS:
フェッチは、ユーザーが最初の文字を入力したときに1回だけ実行する必要があります。

4

2 に答える 2

9

これは機能し、fetchを1回だけ呼び出す必要があります。

var MyView = Backbone.View.extend({
  initialize: function () {
    this.myCollection = new MyCollection();
    this.collectionFetched = false;
  },
  events: {
    'focus #names': 'getAutocomplete'
    'keydown #names': 'fetchCollection'
  },
  fetchCollection: function() {
    if (this.collectionFetched) return;
    this.myCollection.fetch();
    this.collectionFetched = true;
  },
  getAutocomplete: function () {
    $("#names").autocomplete({
        source: JSON.stringify(this.myCollection)
    });
  }
});
于 2012-07-10T13:03:40.663 に答える
2

このようにしてみてください:

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)
        });
    }
});
于 2012-07-10T13:01:22.240 に答える