KnockoutJS - 根据第一个组合框中选择的值填充第二个组合框

时间:2015-03-20 09:25:34

标签: javascript knockout.js

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

现在,我想了解实现这一目标的方法或最佳实践。我想我可以简单地在第一个列表框中添加正常的html / javascript选择更改事件处理程序来完成此操作...但我不确定这是否是推荐的方式(我知道它不是MVVM无论如何)。我觉得既然selectedDataSet是一个可观察的,我应该能够将它链接到一个事件处理程序..还没有?我的问题是怎么样?我可以在我的viewmodel上定义一个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>

2 个答案:

答案 0 :(得分:1)

您可以订阅selectedOption observable的第一个框,并在其发生变化时进行调用。

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

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

答案 1 :(得分:1)

麦克

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

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

然后是ViewModel中的一个proerty:

selectionChanged: function(event) { }

这是你要搜索的内容吗?除此之外,我有一个小建议 - SelectedDataSet和selectedInstrument也可以是可观察的数组。不同之处在于您不会使用&#39;值&#39;招架,但{&#39; selectedOptions&#39;一。当你有多个选择时,这将对你有所帮助,但即使它只是一个选择,我认为这是一个更好的选择。