2012-07-10 2 views
2

소스를 backboneCollection에서 가져 오는 모듈을 만들기 위해 jQueryUi.autocomplete을 사용한다고 가정합시다.jQueryUI.autocomplete 및 Backbone JS를 사용하는 자바 스크립트 모듈

자동 완성 모듈에 대해 다음 코드 (1)를 구현하고
에 Backbone.view (2)를 다음과 같이 구현합니다.

사실 나는 사용자가 글자를 입력하지 않은 경우에도 컬렉션의 가져 오기가 수행되기 때문에 실제로 좋아하지 않습니다.

사용자가 입력 상자에 내용을 입력하기 시작한 경우에만 fetching collection 또는 source function을 어떻게 수행해야합니까?


P.S :
는 이미 비슷한 질문 jQuery Autocomplete Plugin using Backbone JS, 을 기록했지만 aoutocomplete 모듈의 요구가 다른보기에서 공유 할 수 있기 때문에 나는 자동 완성 모듈의 집합으로 인출 이동하기로 결정했다.


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

답변

2

// 의사 코드 jQuery Autocomplete Plugin using Backbone JS

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); 
      } 
     } 
    }); 
}); 
+0

덕분에, 당신의 아이디어에 대한 하나 ... 실제로 무엇을 나는 조금 다르다라고 묻고있다. autocomplete 및 myCollection을 사용하는보기가 하나 뿐인 경우 가상 코드가 잘 작동합니다. 동일한 myCollection을 사용하여 동일한 콜렉션에 대해 두 개의 페치를 수행하는 두 개의 뷰가 있다고 가정 해 보겠습니다. 이런 이유로 저는 자동 완성을위한 모듈을 만들었습니다. –

+0

@LorraineBernard 키, 내가 대답을 업데이트했는지, 원하는 것이 아닌지 확인하십시오. –

관련 문제