автозаполнение с помощью закрытия JavaScript с использованием jquery - PullRequest
0 голосов
/ 10 января 2012

Мне нужно автозаполнение jquery, которое делает только один вызов на сервер, затем сохраняет его локально и использует возвращенный массив при последующих вызовах в jqgrid. он также работает вне сетки для других автозапчастей; у меня есть функция JQuery в моей onload:

$('#text').myAutocomplete({url:'...'});

И еще один в jqgrid - нижеприведенный dataInit является обратным вызовом, который использует аргумент текстового поля для автозаполнения / изменения другими способами. Я использую веб-сервис asp.net, следовательно, msg.d в моем вызове ajax

$('#table').jqGrid({
  ...,
  colModel:[...,
           name:'col1',...,dataInit:function(el){
                       $.myAutocomplete({url:'..',elem:el});
                       }
           ...],
  ...
});

тогда в моей функции автозаполнения:

(function($){
 var returnArray = [];
 $.fn.myAutocomplete = function(options){
   var element = options.elem || this;
   if(returnArray.length === 0){ //checking if the local array is populated or not
     $.ajax({ // all other ajax options for asp.net webservice to respond are also set here
     ...,
     url: options.url,
     success : function(msg){
                returnArray = msg.d;
               }
     });
    }
  return element.autocomplete({source:returnArray}); 
  }
})(jQuery);

проблема в том, что автозаполнение на 'тексте' не работает - я буду тестировать завтра автозаполнение jqgrid на работе

1 Ответ

0 голосов
/ 12 января 2012

/ * Решили изменить подход;написал следующий код
вызов моего автозаполнения для текстового поля * /

$('#textbox').txtAc({url:txtUrl});

// Вызов автозаполнения из обратного вызова в jqgrid

dataInit:function(elem){
var gridArray;
var gridAc = $.getMyGridAc();
gridArray = gridAc.getStoredArray();
elem.autocomplete({source:gridArray});
};

// Среди плагинов/ функции:

(function($){
  $.myAc = function(options){
   var storedArray = [];

   $.fillStoredArray = function(){
     $.ajax({url:options.url,
             ...,
             success:function(msg){
                     storedArray = msg.d;
                     if(options.el){
                         options.el.autocomplete({source:storedArray}); //1st time called, call jquery ui autocomplete from the ajax call if the element was specified (textbox); grid cant specify element in advance
                        }
                     }
     });
   }
   return {
     getStoredArray :function(){
                       if (storedArray.length === 0){
                       $.fillStoredArray();
                     }
      return storedArray;
           }
  }
 }
})(jQuery);

/ * Теперь я могу начать повторно использовать мой плагин - ниже для вызова jqgrid, затем для обычного текстового поля jqgrid, автоматически завершенного:

для jqgrid, 1-йсоздать и вернуть экземпляр замыкания из $ .myAc:

* /

(function($){
   $.prepareGridForAc = function(){
      var myGridAc = $.myAc({url:gridUrl});
      return function getMyGridAc (){
        return myGridAc;
      } 
   }
})(jQuery);

// когда пользователь загружает сетку в первый раз (или активирует вкладку, на которой эта сетка включена) - вызовом prepareGridForAc

//
$.prepareGridforAc();
//

// текстовое поле, автозаполнение:

(function($){
  $.fn.txtAc = function(options){
    var myTxtAc ;
    var acArray;
    $.extend(options,el:this);
    myTxtAc = $.myAc(options);
    acArray = myTxtAc.getStoredArray();
    return this.autocomplete({source:acArray});
  }
})(jQuery);
...