【问题标题】:Knockout JS and Chosen multiselect not working淘汰赛 JS 和选择的多选不起作用
【发布时间】:2012-07-06 20:35:18
【问题描述】:

我正在使用淘汰赛 js 和选择的插件 (https://github.com/harvesthq/chosen) 来尝试制作一个好看的多选。

我尝试了各种方法,但无法让多选功能处理我正在使用的数据。当我单击多选时,即使选项绑定包含正确的数据,也不会显示任何值。

HTML:

<select multiple="multiple" data-bind="options: allCustomers, 
selectedOptions: event().customers, optionsText: 'name', 
optionsValue: 'id', chosen: true " ></select>​

视图模型的简化版:

    function Event()
    {
        this.customers = ko.observableArray();
    };                     

    //for chosen plugin
    ko.bindingHandlers.chosen = {
        update: function(element, valueAccessor, allBindingsAccessor, viewModel)  {
            $(element).chosen();
        }
    }

    function ViewModel()
    {   
        this.event = ko.observable(new Event());
        this.allCustomers = ko.observableArray();
    };

    var viewModel = new ViewModel();

    $.getJSON("/get_json", function(data) 
    {                                  
        for (var c = 0; c < data.customers.length; c++)
        {
            viewModel.allCustomers.push(data.customers[c]);
        }   
    });

    ko.applyBindings(viewModel);   

PHP:

function get_json()
{
    $eventData = array(
        'customers' => array(array('name' => 'Bob', 'id' => 1), array('name' => 'John', 'id' => 2)),
        'moreData' => array(),
        'evenMoreData' => array()
        );

    echo json_encode($eventData);
}

这显示了所选样式的选择框,但是当我单击它时,没有出现任何选项。

当我在视图模型中为客户创建一个本地 JS 数组并将其传递给 allCustomers 时,多选可以正常工作(请参阅我的 jsfiddle),因此它与从服务器获取数据有关,但我已经盯着这个看了一会儿,看不出问题!

非常感谢任何帮助

【问题讨论】:

  • 如果你console.log()这个数组,它匹配本地测试版本吗?页面上没有 javascript 错误?
  • 正确,没有错误,数组与本地测试版本匹配。
  • 可能是异步调用开始,然后应用绑定,然后异步返回并推送到视图模型。当我将新客户推送到数组中时,他们没有出现在选择中,这告诉我选择的更新在初始绑定后不起作用。

标签: php jquery knockout.js jquery-chosen


【解决方案1】:

@Tyrsius 建议在初始绑定后可能没有更新数据后,我发现了问题。

我将$(element).trigger("liszt:updated"); 添加到自定义绑定中,如下所示:

ko.bindingHandlers.chosen = {
    update: function(element, valueAccessor, allBindingsAccessor, viewModel)  {
        $(element).chosen();
        $(element).trigger("liszt:updated");
    }
}

【讨论】:

  • 只是想说非常感谢这个答案!
  • 我用淘汰赛 3.0 试过这个。问题是这会在绑定启动时触发一次。将项目推入数组不会触发此绑定更新。我想知道这是因为 Knockout 优化还是我做错了什么。你能发布一个如何使用这个绑定的例子吗?
  • 什么是listzt?
  • @coder 旧问题,但请参阅此处以获取答案:stackoverflow.com/a/18852516/484072
【解决方案2】:

由于某种原因,接受版本中的代码对我不起作用。可能是因为liszt:updated 命令没有触发选择更新。基于文档here 我编写了自己的版本:

ko.bindingHandlers.chosen = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        $(element).chosen({ width: "95%", placeholder_text_multiple: "Select..." });
        var value = ko.unwrap(valueAccessor());
    },

    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var value = ko.unwrap(valueAccessor());
        $(element).trigger("chosen:updated");

    }
}

【讨论】:

  • 是的,Chosen 改为使用 chosen:updated。见stackoverflow.com/a/18852516/484072
  • 这对我来说是@kubal5003 的一半...... 1)使用该自定义绑定,初始化所选下拉列表,并设置占位符.. 2)从我的下拉列表中选择值会更新视图模型.但是更新视图模型(例如,通过全选按钮)不会更新所选框..(就像未显示选择的选项一样)。你能建议我可能缺少什么吗?
猜你喜欢
  • 2017-12-07
  • 2012-12-04
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2020-08-28
  • 2016-08-21
  • 2012-01-30
  • 2013-05-27
相关资源
最近更新 更多