我怎么得到typeahead在json字符串数组中返回id而不是name

时间:2013-02-20 17:23:32

标签: json return-value typeahead bootstrap-typeahead

在Joomla中使用bootstrap。我试过寻找一个解决方案,并在这里尝试了一些不同的答案,但似乎无法让它工作。

到目前为止,我已经得到以下内容以返回名称,但我希望它在搜索输入中发送id而不是名称。

这是我到目前为止通过php打印的内容:

    jQuery(document).ready(function() {

        var artistData = [{"id":"3","artist_name":"DJ One"},{"id":"2","artist_name":"DJ Two"},{"id":"1","artist_name":"Another DJ"}];

        jQuery('#artist_id').typeahead({

        source: function(query, process) {
            artists = [];
             ids = {};

            jQuery.each(artistData, function(id, artist) {
                ids[artist.artist_name] = artist.id;
                artists.push(artist.artist_name);
            });
            process(artists);
        },
        matcher: function (item) {
            if (item.toLowerCase().indexOf(this.query.trim().toLowerCase()) != -1) {
                return true;
            }
        },

        sorter: function (items) {
            return items.sort();
        },
        updater: function (item) {
            selectedArtist = item.id;
            return item;
        }



        });


    }); 

我尝试过各种各样的问题,但这至少会返回artist_name,但显然会抛出一个mysql错误。如果我在输入中键入id号就可以了。

我只需要弄清楚如何在提交时将值更改为id。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我意识到这可能已经很晚了,但这里发生了一些错误:

  1. 我不确定您使用selectedArtist的位置,因为它没有被任何可见的定义。
  2. matcher中,return永远不会false。这可能实际上是巧合,因为JavaScript会将undefined视为false
  3. 你经历了分解artistData的努力,但你实际上从未实际使用过该函数之外的任何数组(在这种情况下应该用var声明而不是将它添加到全局对象不使用var)。
  4. 由于您将artists数组传递给process,因此在此之后传递的任何item将只是该数组所包含的个人string;它不是原始数组中的JSON对象。
  5. 从那里,您可以参考my answer on an otherwise similar question。 Typeahead 2.x默认情况下不支持使用JSON对象,但如果您覆盖renderselect方法,它们确实支持使用它们,您必须当前作弊这些方法(在其他答案中显示) )。

    最后,您可以使用原始JSON updater(例如item)在{"id":"3","artist_name":"DJ One"}内执行任何操作。因此,你应该return item.artist_name,并且可能会设置一些全局(我想你可能已经尝试这样做)到item.id的值来跟踪实际选择的内容。

    另请注意:如果 - 在用户从生成的预先输入列表中选择item后 - 他们在数据库中不存在的艺术家中输入,那么您< em>应取消设置您在updater中设置的全局,以避免声明id - 无论如何(例如,3)代表他们刚输入的未知艺术家。