【问题标题】:Loading values into Selectize.js将值加载到 Selectize.js
【发布时间】:2014-11-04 21:19:37
【问题描述】:

问题

我有一个文本输入,我选择它作为标签,可以很好地查询远程数据,我可以使用它搜索甚至创建新项目,并且一切正常。

使用选择:

var $select = $('.authorsearch').selectize({
    valueField: 'AuthorId',
    labelField: 'AuthorName',
    searchField: ['AuthorName'],
    maxOptions: 10,
    create: function (input, callback) {
        $.ajax({
            url: '/Author/AjaxCreate',
            data: { 'AuthorName': input },
            type: 'POST',
            dataType: 'json',
            success: function (response) {
                return callback(response);
            }
        });
    },
    render: {
        option: function (item, escape) {
            return '<div>' + escape(item.AuthorName) + '</div>';
        }
    },
    load: function (query, callback) {
        if (!query.length) return callback();
        $.ajax({
            url: '/Author/SearchAuthorsByName/' + query,
            type: 'POST',
            dataType: 'json',
            data: {
                maxresults: 10
            },
            error: function () {
                callback();
            },
            success: function (res) {
                callback(res);
            }
        });
    }
});

文本框:

<input class="authorsearch" id="Authors" name="Authors" type="text" value="" />

例子:

然后,当我选择一个(在本例中为“苹果”)时,它会像您期望的那样出现在徽章中,并且文本框的基础值是这些项目值的逗号分隔列表。

电流输出

问题是当我加载一个页面并希望从数据库中检索的值作为标签显示在选定的文本输入中时,它只加载值,我看不到显示显示名称的方法。

<input class="authorsearch" id="Authors" name="Authors" type="text" value="1,3,4" />

所需输出

我已经尝试了输入值字段的各种值,以使其加载项目以显示它们的显示名称而不是它们的值。下面是一个以 JSON 形式返回的单个对象的示例,能够将这些对象的 JSON 数组加载为选定的标签是理想的选择。

[{"AuthorId":1,"AuthorName":"Test Author"},
 {"AuthorId":3,"AuthorName":"Apple"},
 {"AuthorId":4,"AuthorName":"Test Author 2"}]

我该怎么办?我需要以特定方式形成文本框的值,还是需要使用一些 javascript 加载现有值?

【问题讨论】:

  • 作为更新,我创建了一个 jsfiddle here 可用于测试预加载/行为。

标签: javascript jquery json selectize.js


【解决方案1】:

感谢您的回答,并根据您的 onInitialize() 方法,我最终得到了类似的解决方案。在我的情况下,我只需要翻译一个值,因此我能够将 id 和 label 作为数据属性存储在输入字段中。

<input type="text" data-actual-value="1213" data-init-label="Label for 1213 item">

然后在初始化:

onInitialize: function() {
        var actualValue = this.$input.data('actual-value');
        if (actualValue){
            this.addOption({id: actualValue, value: this.$input.data('init-label')});
            this.setValue(actualValue);
            this.blur();
        }
    }

根据这些选项:

$('input').selectize({
    valueField: 'id',
    labelField: 'value',
    searchField: 'value',
    create: false,
    maxItems: 1,
    preload: true,
    // I had to initialize options in order to addOption to work properly 
    // although I'm loading the data remotely
    options: [],
    load: ... ,
    render: ...,
    onInitialize: ....
});

我知道这不能回答您的问题,但想分享一下,以防万一这对某人有所帮助。

【讨论】:

    【解决方案2】:

    我最终使用onInitialize 回调来加载存储在data-* 字段中的JSON 值。你可以在here in this jsfiddle看到它。

    <input class="authorsearch" id="Authors" name="Authors" type="text" value="" 
     data-selectize-value='[{"AuthorId":1,"AuthorName":"Test"},{"AuthorId":2,"AuthorName":"Test2"}]'/>
    

    基本上,它解析data-selectize-value 值,然后将选项添加到选择中,然后添加项目本身。

    onInitialize: function() {
        var existingOptions = JSON.parse(this.$input.attr('data-selectize-value'));
        var self = this;
        if(Object.prototype.toString.call( existingOptions ) === "[object Array]") {
            existingOptions.forEach( function (existingOption) {
                self.addOption(existingOption);
                self.addItem(existingOption[self.settings.valueField]);
            });
        }
        else if (typeof existingOptions === 'object') {
            self.addOption(existingOptions);
            self.addItem(existingOptions[self.settings.valueField]);
        }
    }
    

    我的解决方案确实假设我的 JSON 对象格式正确,并且它是单个对象或对象数组,因此它可能适合也可能不适合其他人的需求。

    所以它解析:

    [{"AuthorId":1,"AuthorName":"Test"},
     {"AuthorId":2,"AuthorName":"Test2"}]
    

    收件人:

    当然基于我上面原始帖子中的选择设置。

    【讨论】:

    • 2014 年使用的 jsfiddle 的 CDN 不再响应。我再次编辑了指向工作 jsfiddle 的链接。
    【解决方案3】:

    使用 items 属性的新版本选择更简单。基本上要设置一个选定的项目,您需要首先在选项中拥有它。但是如果你像我一样使用远程数据,选项是空的,所以你需要将它添加到两个地方。

    $('select').selectize({
            valueField: 'id',
            labelField: 'name',
            options:[{id:'123',name:'hello'}],
            items: ['123'],
            ...
    

    这对我有用,我花了一段时间才弄清楚...所以分享一下

    【讨论】:

    • 您是否总是必须为远程数据执行此操作?我想知道这是否是我在stackoverflow.com/questions/46802064/… 的问题,如果您有时间检查一下,也许您可​​以看到我做错了什么。
    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2016-07-30
    • 2017-12-02
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多