initSelection is not getting called in select2 jquery plugin
Asked Answered
E

4

18

I am using select2 jquery plugin from http://ivaynberg.github.io/select2/.

I am using following code.

 $(document).ready(function () {
            $("#e6").select2({
                placeholder: "Search for a movie",
                minimumInputLength: 1,
                ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
                    url: "http://api.rottentomatoes.com/api/public/v1.0/movies.json",
                    dataType: 'jsonp',
                    quietMillis: 1000,
                    data: function (term, page) {
                        return {
                            q: term, // search term
                            page_limit: 10,
                            apikey: "ju6z9mjyajq2djue3gbvv26t" // please do not use so this example keeps working
                        };
                    },
                    results: function (data, page) { // parse the results into the format expected by Select2.
                        // since we are using custom formatting functions we do not need to alter remote JSON data
                        return { results: data.movies };
                    }
                },
                initSelection: function (element, callback) {
                    var id = 9942;//$(element).val();
                    alert('initSelection');
                    if (id !== "") {
                        $.ajax("http://api.rottentomatoes.com/api/public/v1.0/movies/" + id + ".json", {
                            data: {
                                apikey: "ju6z9mjyajq2djue3gbvv26t"
                            },
                            dataType: "jsonp"
                        }).done(function (data) { callback(data); });
                    }
                },

                formatResult: movieFormatResult, // omitted for brevity, see the source of this page
                formatSelection: movieFormatSelection,  // omitted for brevity, see the source of this page
                dropdownCssClass: "bigdrop", // apply css that makes the dropdown taller
                escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results
            });

        });


        $(document).ready(function () {
            $("#e6").on("select2-selecting", function (e) {
                var v = 10;
                alert("selecting val=" + e.val + " choice=" + JSON.stringify(e.choice));
                var id = document.getElementById('<%= savebtn.ClientID %>');
                id.value = e.val;
                id.click();

            });
        });

Problem: For some reasons initSelection is not getting called and because of this, I am not able to set value for the textbox across post-backs.

I am using loading remote data example from http://ivaynberg.github.io/select2/ site.

I looked at the documentation for initSelection and it says "This function will only be called when there is initial input to be processed.", I am not sure what exactly it means.

Am I doing something wrong? Please help

Entree answered 15/8, 2013 at 12:15 Comment(0)
T
30

You should provide initial value:

<input ... value="192" ... />

or

$('#e6').select2('val', 192);

For multiple values, either:

<input ... value="192,193" ... />

or

$('#e6').select2('val', [192,193]);

See JSFiddle.

Triparted answered 15/8, 2013 at 13:22 Comment(3)
This is right. Even if you provide an initSelection function, select2 decides not to call it unless you provide a "value" attr. So you're forced to either use a value attr, or provide one and not use it.Margiemargin
The problem is that this will not work for multiple selected optionsImmixture
Also the value attribute must be non-empty - value="" doesn't work either. You can put there any arbitrary string, but something must be there.Marnimarnia
I
9

You can do simply like this if you don't want to use a value by default.

$(document).ready(function () {
            $("#e6").select2({
        ...
                },
                initSelection: function (element, callback) {
        ...
                },
                formatResult: movieFormatResult, // omitted for brevity, see the source of this page
                formatSelection: movieFormatSelection,  // omitted for brevity, see the source of this page
                dropdownCssClass: "bigdrop", // apply css that makes the dropdown taller
                escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results
            }).select2('val', []);

        });

Adding select2('val', []); at the end of declaration solve this problem.

Intrepid answered 16/10, 2014 at 7:39 Comment(1)
much better than using a dummy value in HTML, thanks!Cavatina
U
0

Well this is what I do for more complex situations since -if not controlled- initalvalue gets saved to db (in coffeescript)

 if $("#categories").val().length is 0 
    $("#categories").val "initialValue"
  $("#categories").select2
    closeOnSelect:false
    containerCssClass: "select2-default"
    formatNoMatches: ->
      I18n.t "shared.navbar.no_matches_found"
    formatInputTooShort: (input, min) ->
      I18n.t("shared.navbar.please_select") + " " + (min - input.length) + " " + I18n.t("shared.navbar.more_characters")
    formatSelectionTooBig: (limit) ->
      I18n.t("shared.navbar.you_can_only_select") + " " + limit + " " + I18n.t("shared.navbar.item") + ((if limit is 1 then "" else "s"))
    formatLoadMore: (pageNumber) ->
      I18n.t "shared.navbar.loading_more_results"
    formatSearching: ->
      I18n.t "shared.navbar.searching"
    minimumInputLength: 3
    width: "100%"
    multiple: true
    ajax:
      url: "/categories/list_styles"
      dataType: "json"
      quietMillis: 100
      data: (term, page) ->
        q: term
        page_limit: 10
        page: page
      results: (data) ->
        hashtable = {}
        results = []
        $.each data, (index, item) ->
          if hashtable[item.parent] is `undefined`
            hashtable[item.parent] =
              text: item.parent
              children: []
            results.push hashtable[item.parent]
          hashtable[item.parent].children.push
            id: item._id
            text: item.title
        results: results
    initSelection: (element, callback) ->
      data1 = []
      if element.val() is "initialValue"
        element.val('')
      jQuery(element.val().split(",")).each ->
        $.ajax
          type: "get"
          url: "/providers/list_categories"
          async: false
          dataType: "json"
          data: { id: $("#provider_id").val(), selected: $("#categories").val().split(",") }
          success: (category) ->
            $.each category, (i, obj) ->
              data1.push
                id: @_id
                text: @title
        callback data1
  $.each $(".select2-container"), (i, n) ->
    $(n).next().show().fadeTo(0, 0).height("0px").css "left", "auto" # make the original select visible for validation engine and hidden for us
    $(n).prepend $(n).next()
    $(n).delay(500).queue ->
      $(this).removeClass "validate[required]" #remove the class name from select2 container(div), so that validation engine dose not validate it
      $(this).dequeue() 
Unbridle answered 18/3, 2014 at 10:59 Comment(0)
I
0

Use this:

remove the previous options selected options with this:

       arr = json.filter(function( obj ) {
            return  arrSelectedValues.indexOf(obj.foo) == -1;
        });

and create a new element selected:

        option = document.createElement('option');
        option.value = 'foo';
        option.innerHTML = 'foo';
        option.selected = true;

        document.getElementById('selectFoobares').appendChild(option);

not the best way but works

Immixture answered 17/11, 2014 at 20:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.