Browse Source

add data method that works with objects instead of ids like val. fixes #166

Igor Vaynberg 13 năm trước cách đây
mục cha
commit
e12fbdec7e
1 tập tin đã thay đổi với 43 bổ sung5 xóa
  1. 43 5
      select2.js

+ 43 - 5
select2.js

@@ -1152,7 +1152,7 @@
 
             selection.delegate("abbr", "click", this.bind(function (e) {
                 if (!this.enabled) return;
-                this.val("");
+                this.clear();
                 killEvent(e);
                 this.close();
                 this.triggerChange();
@@ -1170,6 +1170,13 @@
             this.opts.element.bind("open", function() { focusser.hide(); });
         },
 
+        clear: function() {
+            this.opts.element.val("");
+            this.selection.find("span").empty();
+            this.selection.removeData("select2-data");
+            this.setPlaceholder();
+        },
+
         /**
          * Sets selection based on source element's value
          */
@@ -1197,7 +1204,7 @@
             var opts = this.parent.prepareOpts.apply(this, arguments);
 
             if (opts.element.get(0).tagName.toLowerCase() === "select") {
-                // install sthe selection initializer
+                // install the selection initializer
                 opts.initSelection = function (element, callback) {
                     var selected = element.find(":selected");
                     // a single select box always has a value, no need to null check 'selected'
@@ -1274,6 +1281,9 @@
 
         // single
         updateSelection: function (data) {
+
+            this.selection.data("select2-data", data);
+
             this.selection
                 .find("span")
                 .html(this.opts.formatSelection(data));
@@ -1316,6 +1326,20 @@
         // single
         clearSearch: function () {
             this.search.val("");
+        },
+
+        // single
+        data: function(value) {
+            if (arguments.length === 0) {
+                return this.selection.data("select2-data");
+            } else {
+                if (!value || value === "") {
+                    this.clear();
+                } else {
+                    this.opts.element.val(!value ? "" : this.id(value));
+                    this.updateSelection(value);
+                }
+            }
         }
     });
 
@@ -1736,7 +1760,6 @@
                 this.updateSelection(data);
             } else {
                 val = (val === null) ? [] : val;
-                this.setVal(val);
                 // val is a list of objects
                 $(val).each(function () { data.push(self.id(this)); });
                 this.setVal(data);
@@ -1767,7 +1790,7 @@
             this.searchContainer.show();
             // make sure the search container is the last item in the list
             this.searchContainer.appendTo(this.searchContainer.parent());
-            // since we collapsed the width in dragStarteed, we resize it here
+            // since we collapsed the width in dragStarted, we resize it here
             this.resizeSearch();
 
             // update selection
@@ -1777,6 +1800,21 @@
             });
             this.setVal(val);
             this.triggerChange();
+        },
+
+        // multi
+        data: function(values) {
+            var self=this, ids;
+            if (arguments.length === 0) {
+                 return this.selection
+                     .find(".select2-search-choice")
+                     .map(function() { return $(this).data("select2-data"); })
+                     .get();
+            } else {
+                ids = $.map(values, function(e) { return self.opts.id(e)});
+                this.setVal(ids);
+                this.updateSelection(values);
+            }
         }
     });
 
@@ -1785,7 +1823,7 @@
         var args = Array.prototype.slice.call(arguments, 0),
             opts,
             select2,
-            value, multiple, allowedMethods = ["val", "destroy", "open", "close", "focus", "isFocused", "container", "onSortStart", "onSortEnd", "enable", "disable", "positionDropdown"];
+            value, multiple, allowedMethods = ["val", "destroy", "open", "close", "focus", "isFocused", "container", "onSortStart", "onSortEnd", "enable", "disable", "positionDropdown", "data"];
 
         this.each(function () {
             if (args.length === 0 || typeof(args[0]) === "object") {