【问题标题】:KnockoutJS - populating second combobox based on value selected in first comboboxKnockoutJS - 根据在第一个组合框中选择的值填充第二个组合框
【发布时间】:2015-03-20 09:25:33
【问题描述】:

以下是我编写的第一段 knockoutjs 代码。在下面的代码中,我有两个列表框。第一个在页面加载后填充并且工作正常。我接下来要做的是,当用户从 cmbDataSets 列表框中选择一个项目时,我想进行第二次 ajax 调用来填充我的视图模型的“仪器”属性。稍后当用户选择仪器时,我想再次调用以获取我将在网格中显示的数据(使用 slickgrid.js)。

现在,我想了解实现此目的的方法或最佳实践。我想我可以简单地在第一个列表框中添加普通的 html/javascript 选择更改事件处理程序来完成此操作......但我不确定这是否是推荐的方式(我知道它不是 MVVM 方式)。我觉得由于 selectedDataSet 是一个可观察的,我应该能够将它链接到事件处理程序......不是吗?我的问题是如何?我可以在我的视图模型上定义一个 onSelectedDataSetChange 方法吗?如果可以,我如何将它“挂钩”到 cmbDataSets 控件的实际选择更改中?

<div class="container">
    <label for="cmbDataSets">Select list:</label>
    <select id="cmbDataSets" data-bind="options: dataSets, optionsText:'descr', value:selectedDataSet, optionsCaption:'Choose' " class="form-control"></select>
    <label for="cmbInstruments">Select instrument:</label>
    <select id="cmbInstruments" data-bind="options: instruments, optionsText:'intrument', value:selectedInstrument, optionsCaption:'Choose' " class="form-control"></select>
</div>

<script type="text/javascript">
    $(document).ready(function () {
        var viewModel = {
            dataSets: ko.observableArray(),
            instruments: ko.observableArray(),
            selectedDataSet: ko.observable(),
            selectedInstrument: ko.observable()
        }

        $.ajax({
            url: '/ds/sets',
            type: "GET",
            dataType: "json",
            success: function (data) {
                debugger;
                console.log(data);
                viewModel.dataSets(data);
            }
        });
        ko.applyBindings(viewModel);
    });
</script>

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    您可以订阅第一个可观察的 selectedOption 框,并在它发生变化时拨打电话。

    selectedOption = ko.observable();
       selectedOption.subscribe(function (newValue) {
                secondBoxSource(ajaxCallFunction(newValue));
            });
    

    其中 ajaxCallFunction() 是用于获取第二个框的数据的函数,newValue 是从第一个框新选择的值。

    【讨论】:

    • 太棒了。经过一些谷歌搜索后,我还发现我可以在绑定中添加一个更改事件,例如'data-bind:event:{ change:onDataSetChanged} ...',但还无法弄清楚传递已选择的值.你的方法应该对我有用。谢谢!
    【解决方案2】:

    迈克。

    检查此代码,用于在视图中设置更改事件:

    <select data-bind="event: { change: selectionChanged }"></select>
    

    然后是 ViewModel 中的一个属性:

    selectionChanged: function(event) { }
    

    这就是您要搜索的内容吗?除此之外,我还有一个小建议——SelectedDataSet 和 selectedInstrument 也可以是 observable 数组。不同之处在于您将使用的不是“价值”投标,而是“selectedOptions”。当您有多项选择时,这会有所帮助,但即使是单项选择,我认为它也是一个更好的选择。

    【讨论】:

    • 我没有看到您所指的代码..但我认为这是我要走的路。即向视图模型添加 onDataSetChange 事件,并在选择控件中绑定到它。我不确定哪种方法更好,这个方法还是 HotTowelie 建议的方法。
    • 我从这里获取了代码,jsfiddle.net/rniemeyer/LBz6d。它甚至不是我的代码,我只是找到了它。
    • 这很有趣,因为它似乎是多余的。我认为个人可能正在演示这两种选择。我还发现这个也提倡使用订阅而不是绑定到更改事件:stackoverflow.com/questions/21756805/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多