jQuery select2:重新创建重复标记

我今天早些时候问了一个问题( jquery select2:从php-mysql获取数据时出错 )。 但是,我正在尝试修复它并且现在这样做我有点奇怪的问题。 我不确定为什么会这样发生。

以下是JavaScript代码。

var lastResults = []; $("#tags").select2({ multiple: true, placeholder: "Please enter tags", tokenSeparators: [","], initSelection : function (element, callback) { var data = []; $(element.val().split(",")).each(function () { data.push({id: this, text: this}); }); callback(data); }, ajax: { multiple: true, url: "fetch.php", dataType: "json", type: "POST", data: function(term) { return {q: term}; }, results: function(data) { return {results: data}; }, }, createSearchChoice: function (term) { var text = term + (lastResults.some(function(r) { return r.text == term }) ? "" : " (new)"); return { id: term, text: text }; }, }); $('#tags').on("change", function(e){ if (e.added) { if (/ \(new\)$/.test(e.added.text)) { var response = confirm("Do you want to add the new tag "+e.added.id+"?"); if (response == true) { alert("Will now send new tag to server: " + e.added.id); /* $.ajax({ type: "POST", url: '/someurl&action=addTag', data: {id: e.added.id, action: add}, error: function () { alert("error"); } }); */ } else { console.log("Removing the tag"); var selectedTags = $("#tags").select2("val"); var index = selectedTags.indexOf(e.added.id); selectedTags.splice(index,1); if (selectedTags.length == 0) { $("#tags").select2("val",""); } else { $("#tags").select2("val",selectedTags); } } } } });

这是php代码( fetch.php

 prepare("SELECT tid,tag FROM tag WHERE tag LIKE :search LIMIT 4"); // Add a wildcard search to the search variable $query->execute(array(':search'=>"%".$search."%")); // Do a quick fetchall on the results $list = $query->fetchall(PDO::FETCH_ASSOC); // Make sure we have a result if(count($list) > 0){ foreach ($list as $key => $value) { $data[] = array('id' => $value['tid'], 'text' => $value['tag']); } } else { $data[] = array('id' => '0', 'text' => 'No Products Found'); } // return the result in json echo json_encode($data); ?> 

select2版本是3.5

上面的代码可以使用fetch.php从数据库发送/接收请求。

问题是在我的数据库中有两个记录testtemp当我标记其中任何一个时它创建新标记。

它应该像这样工作: 如果数据库有值,那么它不会创建具有相同名称的新标记。

在此处输入图像描述

更新

在此处输入图像描述

标签需要id和文本。 您遇到的问题是您的文字与ID不符。

因此,即使您编写相同的文本,Select2也认为新文本是新选项,因为ID不匹配。

要解决您的问题,您需要使用与文本相同的值设置ID。 将fetch.php的foreach更改为以下内容:

 foreach ($list as $key => $value) { $data[] = array('id' => $value['tag'], 'text' => $value['tag']); } 

更新:您还需要更新变量lastResults以避免重复使用相同文本的标记。 绑定select2时,需要将ajaxresults属性更改为this(基于以下答案 :

 ajax: { multiple: true, url: "fetch.php", dataType: "json", type: "POST", data: function(term) { return {q: term}; }, results: function(data) { lastResults = data.results; return {results: data}; }, }, 

注意lastResults = data.results; 。 如果没有这个, lastResults变量总是为空,并且当执行createSearchChoice函数时,它将始终返回一个新标记。

最后它现在正在运作。 我要感谢@alex和@milz的支持。 这是完整的n个最终代码。 现在重复的标签没有创建。 但是,我正在努力在数据库中添加标签。

php / html文件

 

这是从数据库获取数据的php文件。 fetch.php

 prepare("SELECT tid,tag FROM tag WHERE tag LIKE :search LIMIT 4"); // Add a wildcard search to the search variable $query->execute(array(':search'=>"%".$search."%")); $list = $query->fetchall(PDO::FETCH_ASSOC); if(count($list) > 0){ foreach ($list as $key => $value) { $data[] = array('id' => $value['tag'], 'text' => $value['tag']); } } else { $data[] = array('id' => 'No Products Found', 'text' => 'No Products Found'); } echo json_encode($data); ?> 

花了很多时间。 差不多3天。 我希望它能挽救一些人的努力。