値のセットを含むドロップダウンを用意し、そこにリストされていない新しい値をユーザーが「選択」できるようにしたいのですが。
モードで使用している場合、select2がこれをサポートしているようですがtags
、タグを使用せずにそれを行う方法はありますか?
値のセットを含むドロップダウンを用意し、そこにリストされていない新しい値をユーザーが「選択」できるようにしたいのですが。
モードで使用している場合、select2がこれをサポートしているようですがtags
、タグを使用せずにそれを行う方法はありますか?
回答:
バージョン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メーリングリストの回答から取得されましたが、現在リンクを見つけることができません)
selectOnBlur: true
仕事をすることは参照してください。stackoverflow.com/questions/25616520/...
tags: []
一緒に使用したいと思うでしょうcreateSearchChoice
。
優秀な答えが提供する@fmpwizardは Selectセレクト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;
}
});
コードを存続させるために、コメントから@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'}]
});
@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
私はケビン・ブラウンからこれを偶然見つけました。 https://stackoverflow.com/a/30019966/112680
あなたがしなければならないすべてv4.0.6
は使用tags: true
パラメータです。
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();
助けてくれてありがとう、私は以下のコードをCodeigniter II内で使用しました。バージョン3.5.2の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]'};
}
},
});