Select2 드롭 다운이지만 사용자가 새 값을 허용 하시겠습니까?


125

값 세트가있는 드롭 다운을 원하지만 사용자가 여기에 나열되지 않은 새 값을 "선택"할 수 있도록합니다.

나는 것을 알 선택 2는 당신이 그것을 사용하는 경우이 지원 tags모드하지만 태그를 사용하지 않고 할 수있는 방법이 있나요?


1
Select2는 나를 위해 일한 적이 없으며 적어도 createSearchChoice는 4.0.3에서 나를 위해 일한 적이 없으며 동일한 키워드를 반환하기 위해 사용자가 ajax가 완료되기를 기다리지 않았으므로 내 라이브러리를 롤아웃해야했습니다. 난 당신이 내 대답에 동의하지 않는 경우 투표를하지 말아주십시오, 그것이 내가했다으로 여전히 혼란 다른 사람을 도움이 될 생각하기 때문에 그것을 공유 : github.com/razzbee/tagcomplete
razzbee

답변:


100

버전 4 이상의 경우 Kevin Brown의 아래 답변을 확인하십시오.

Select2 3.5.2 이하에서는 다음과 같이 사용할 수 있습니다.

$(selector).select2({
  minimumInputLength:1,
  "ajax": {
    data:function (term, page) {
      return { term:term, page:page };
    },
    dataType:"json",
    quietMillis:100,
    results: function (data, page) {
      return {results: data.results};
    },
    "url": url
  },
  id: function(object) {
    return object.text;
  },
  //Allow manually entered text in drop down.
  createSearchChoice:function(term, data) {
    if ( $(data).filter( function() {
      return this.text.localeCompare(term)===0;
    }).length===0) {
      return {id:term, text:term};
    }
  },
});

(select2 메일 링리스트의 답변에서 가져 왔지만 지금 링크를 찾을 수 없음)


4
답변이 늦어서 죄송합니다. 솔루션에 대해 대단히 감사합니다! 다른 포스터는 당신을 두 배로 멋지게 만드는 요점 btw에 대한 링크를 게시했습니다! :)
johnjohn

rrauenza 멋진, 내가 찾고 있었던 정확하게
마티아스 S

4
selectOnBlur: true의지를 추가하면 다음을 참조하십시오. stackoverflow.com/questions/25616520/…
Alireza Fattahi 2014 년

1
그냥 머리 미래의 독자까지, 당신은 아마 사용되고 싶어 tags: []과 함께 createSearchChoice.
Kevin Brown

5
위에 링크 된 바이올린이 깨진 것 같습니다.
Wolfr

175

우수한 대답 에 의해 제공 @fmpwizard는 선택 2 3.5.2 이하 작동, 하지만 4.0.0에서 작동하지 않습니다 .

초창기부터 (이 질문만큼 빠르지는 않음) Select2는 사용자가 허용하는 경우 자신의 가치를 추가 할 수있는 "태그 지정"을 지원했습니다. 이것은 tags옵션을 통해 활성화 할 수 있으며 문서의 예제를 가지고 놀 수 있습니다 .

$("select").select2({
  tags: true
});

기본적으로 입력 한 검색어와 동일한 텍스트가있는 옵션이 생성됩니다. 특별한 방법으로 표시하려는 경우 사용되는 개체를 수정하거나 선택한 후 원격으로 개체를 만들 수 있습니다.

$("select").select2({
  tags: true,
  createTag: function (params) {
    return {
      id: params.term,
      text: params.term,
      newOption: true
    }
  }
});

select2:select이벤트 를 통해 전달 된 개체에서 쉽게 발견 할 수있는 플래그 역할을하는 것 외에도 추가 속성을 사용하면 결과에서 옵션을 약간 다르게 렌더링 할 수 있습니다. 따라서 옆 에 " (new) " 를 넣어 새 옵션이라는 사실을 시각적으로 알리고 싶다면 다음과 같이 할 수 있습니다.

$("select").select2({
  tags: true,
  createTag: function (params) {
    return {
      id: params.term,
      text: params.term,
      newOption: true
    }
  },
  templateResult: function (data) {
    var $result = $("<span></span>");

    $result.text(data.text);

    if (data.newOption) {
      $result.append(" <em>(new)</em>");
    }

    return $result;
  }
});

즉 Markus1980Wien @ 매우 도움이되었다
abiieez

이 스 니펫을 여러 번 사용한 것 같습니다.
Sahu V Kumar

두 번 확인하지 않으면 select2 에이 옵션을 추가하지 말고 ajax 옵션을 추가하십시오. select2 아약스
Zohaib

2
이 방식으로 버전 select2 (4.0.6)에서 작동합니다. $ ( "select"). select2 ({tags : true, createTag : function (params) {return {id : params.term, text : params.term, newOption : true}}, templateResult : function (data) {var result = data.text; if (data.newOption) {result = result + '(new)';} return result;}}); 감사 @Kevin 브라운
M. 살라

이것이 최고의 응답이어야합니다. 나는 이것에 대해 잠시 찾고 있었고이 옵션은 내가 주제에 대해 본 모든 질문에 답합니다.
Justin

14

코드를 유지하기 위해 그의 의견 에서 @rrauenza Fiddle의 코드 를 게시 하고 있습니다.

HTML

<input type='hidden' id='tags' style='width:300px'/>

jQuery

$("#tags").select2({
    createSearchChoice:function(term, data) { 
        if ($(data).filter(function() { 
            return this.text.localeCompare(term)===0; 
        }).length===0) 
        {return {id:term, text:term};} 
    },
    multiple: false,
    data: [{id: 0, text: 'story'},{id: 1, text: 'bug'},{id: 2, text: 'task'}]
});

2
바이올린을 사용했지만 Chrome에서 작동하지 않는 것 같습니다. 확인 할수 있어요?
IcedDante

@IcedDante 코드가 작동 중입니다. 바이올린의 요점은 어떻게해야하는지 보여주는 것입니다 (선택은 바이올린에 숨겨져 있습니다)
Michel Ayres

4
바이올린에 가면 아무데도 select2 드롭 다운이 표시되지 않습니다. 실제로 ... 뭔가를하는 예가 있으면 좋지 않을까요?
IcedDante

외부 소스의 데이터를 어떻게 설정할 수 있습니까? 선택한 국가의 도시를로드하고 싶은데 선택한 국가 자체가 드롭 다운이면 어떻게 되나요?
Ali Baig

12

이러한 답변 중 많은 부분이 4.0 이상에서 작동하지 않기 때문에 ajax를 사용하는 경우 서버가 새 값을 옵션으로 추가하도록 할 수 있습니다. 따라서 다음과 같이 작동합니다.

  1. 사용자가 값을 검색 (서버에 ajax 요청)
  2. 가치가 큰 경우 옵션을 반환하십시오. 서버가 다음과 같은 옵션을 추가하지 않으면 :[{"text":" my NEW option)","id":"0"}]
  3. 양식이 제출되면 해당 옵션이 db에 있는지 확인하고 저장하기 전에 작성하지 않았는지 확인하십시오.


4

@fmpwizard 답변에 대한 개선 :

//Allow manually entered text in drop down.
createSearchChoice:function(term, data) {
  if ( $(data).filter( function() {
    return term.localeCompare(this.text)===0; //even if the this.text is undefined it works
  }).length===0) {
    return {id:term, text:term};
  }
},

//solution to this error: Uncaught TypeError: Cannot read property 'localeCompare' of undefined

나는 이것을 약간 수정하여 사용했습니다. 잠시 후에 대답을 올릴 것이지만 감사합니다.
Sam


1
var text = 'New York Mills';
var term = 'new york mills';
return text.localeCompare(term)===0;

대부분의 경우 값을 민감하지 않은 레지스터와 비교해야합니다. 그리고이 코드는 false를 반환하여 데이터베이스에 중복 레코드를 생성합니다. 또한 String.prototype.localeCompare ()는 브라우저 Safary에서 지원되지 않으며이 코드는이 브라우저에서 작동하지 않습니다.

return this.text.localeCompare(term)===0;

더 나은 대체 할 것입니다

return this.text.toLowerCase() === term.toLowerCase();

1

도움을 주신 분들께 감사 드리며, Codeigniter II 내에서 아래 코드를 사용하고 있습니다 : 3.5.2 of select2.

var results = [];
var location_url = <?php echo json_encode(site_url('job/location')); ?>;
$('.location_select').select2({
    ajax: {
        url: location_url,
        dataType: 'json',
        quietMillis: 100,
        data: function (term) {
            return {
                term: term
            };
        },
        results: function (data) {
            results = [];
            $.each(data, function(index, item){
                results.push({
                    id: item.location_id,
                    text: item.location_name
                });
            });
            return {
                results: results
            };
        }
    },
    //Allow manually entered text in drop down.
    createSearchChoice:function(term, results) {
        if ($(results).filter( function() {
            return term.localeCompare(this.text)===0; 
        }).length===0) {
            return {id:term, text:term + ' [New]'};
        }
    },
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.