2015-08-04 1 views
6

Ich versuche, einen benutzerdefinierten Datenadapter nach einem Beispiel hier zu erstellen: http://select2.github.io/announcements-4.0.html#query-to-data-adapter. Wie kann ich die Zeile, die das select2-Steuerelement erstellt, außerhalb der Funktion mit der Definition von DataAdapter verschieben (siehe Code unten)?Select2 4 benutzerdefinierte Datenadapter

<!DOCTYPE html> 
<head> 
    <title></title> 
    <link href="select2.css" rel="stylesheet" /> 
    <script type="text/javascript" src="http://code.jquery.com/jquery-2.1.4.js"></script> 
    <script type="text/javascript" src="select2.full.js"></script> 
    <script type="text/javascript"> 
     $.fn.select2.amd.require(
      ['select2/data/array', 'select2/utils'], 
      function (ArrayData, Utils) { 
       function CustomData ($element, options) { 
        CustomData.__super__.constructor.call(this, $element, options); 
       } 

       Utils.Extend(CustomData, ArrayData); 

       CustomData.prototype.query = function (params, callback) { 
        var data = {results: []}; 
        data.results.push({id: params.term, text: params.term}); 
        data.results.push({id: 11, text: 'aa'}); 
        data.results.push({id: 22, text: 'bb'}); 
        callback(data); 
       }; 

// Works if uncommented, but this line needs to be elsewhere (in $(document).ready()). 
       //$("#my").select2({tags: true, dataAdapter: CustomData}); 
      }); 

     $(document).ready(function() { 
// This line does not work here.    
      $("#my").select2({tags: true, dataAdapter: CustomData}); 
     }); 
    </script> 
</head> 
<body> 
    <select id="my"></select> 
</body> 
</html> 

Antwort

11

Sie definieren es über AMD-Muster:

$.fn.select2.amd.define('select2/data/customAdapter',[ 
     'select2/data/array', 
     'select2/utils' 
    ], 
    function (ArrayAdapter, Utils) { 

     function CustomDataAdapter ($element, options) { 
      CustomDataAdapter.__super__.constructor.call(this, $element, options); 
     } 
     Utils.Extend(CustomDataAdapter, ArrayAdapter); 

     CustomDataAdapter.prototype.current = function (callback) { 

      callback(...); 

     }; 

     return CustomDataAdapter; 
    } 
); 

var customAdapter=$.fn.select2.amd.require('select2/data/customAdapter'); 

$("#my").select2({ 
    tags: true, 
    dataAdapter: customAdapter 
}); 
+0

nicht für mich arbeiten, erhalte ich "Kann Eigenschaft erhalten 'amd' undefinierter oder NULL-Verweis": http: // Pastebin .com/yqarRJRu – PowerGamer

+0

gerade versucht, Ihren Code erfolgreich in mehreren Browsern in Geige - enthalten Sie die neueste Version von select2 (v4.0.0)? https://jsfiddle.net/hvzfmthm/ – gunthor

+0

Ich änderte alle URLs zu Online-Hosts (http://pastebin.com/0F053u3j), aber immer noch den gleichen Fehler in IE11. – PowerGamer