KendoUI - 使用 MVVM 和远程数据时的级联下拉列表

Posted

技术标签:

【中文标题】KendoUI - 使用 MVVM 和远程数据时的级联下拉列表【英文标题】:KendoUI - Cascading Dropdownlist when using MVVM and Remote Data 【发布时间】:2013-08-08 21:48:56 【问题描述】:

我有一个 KendoUI 下拉列表,它从 Web 服务中获取数据,根据所选项目填充第二个下拉列表。我正在使用 MVVM 绑定。

我的代码如下:

<div id="ddlDiv">
    <div data-container-for="MEASURE" required class="k-input k-edit-field">
    <select id="MEASURE"
            name="MEASURE"
            data-role="dropdownlist" 
            data-text-field="FIELD_NAME" 
            data-value-field="FIELD_ID" 
            data-bind="value: summaryDef.MeasureID, source: fieldList"                                 
            ></select>                      
    </div>       

    <div data-container-for="OPERATION" required class="k-input k-edit-field">
    <select id="OPERATION"
            data-cascade-from: "MEASURE"
            data-role="dropdownlist" 
            data-text-field="TYPE" 
            data-value-field="OP_ID" 
            data-source=opListDS
            data-bind="value: summaryDef.OperationID"                 
            ></select>                      
    </div>               

 datasetMetaModel = kendo.observable(
    fieldList: datasetModel.FieldDTOList,
    summaryDef: datasetModel.SummaryDef
    );

kendo.bind($("#ddlDiv"), datasetMetaModel);

var opListDS = BuildOperationFields();
function BuildOperationFields() 
    opListDS = new kendo.data.DataSource(
        transport: 
            read: 
                url: '@Url.Action("GetMeasureOperations", "Wizard")',
                dataType: 'json',
                contentType: "application/json; charset=utf-8",
                serverFiltering: true,
                type: "GET"
            
        

    );

    return opListDS;        

这两个列表最初都正确填充了数据,并正确绑定到模型。但是,更改第一个下拉列表的值不会导致第二个下拉列表刷新其数据。永远不会触发对 Web 服务的调用。

我在这里看到过使用本地数据的类似情况:

MVVM binding for cascading DropDownList

【问题讨论】:

【参考方案1】:

我不知道这对你来说是否仍然是一个问题,因为这个问题被问到已经有一段时间了,但我想我会回答,因为我今天自己也遇到了类似的问题,并设法通过解决方法解决了它。

我所做的是将处理程序绑定到父组合框的 onChange 事件,并在子组合框的数据源上手动调用 read():

例如

html

<div id="content-wrapper">
    <div class="editor-row">
         <div class="editor-label"><label>Country:</label></div>
         <div class="editor-field">
            <select id="Country" name="Country" data-role="combobox"
                    data-text-field="CountryName"
                    data-value-field="CountryId"
                    data-filter="contains"
                    data-suggest="false"
                    required
                    data-required-msg="country required"
                    data-placeholder="Select country..."
                    data-bind="source: dataSourceCountries, value: country, events:  change: refreshCounties ">
            </select>
            <span class="field-validation-valid" data-valmsg-for="Country" data-valmsg-replace="true"></span>
         </div>
   </div>
   <div class="editor-row">
        <div class="editor-label"><label>County:</label></div>
        <div class="editor-field">
           <select id="County" name="County" data-role="combobox"
                   data-text-field="CountyName"
                   data-value-field="CountyId"
                   data-filter="contains"
                   data-auto-bind="false"
                   data-suggest="false"
                   data-placeholder="Select county..."
                   data-bind="source: dataSourceCounties, value: county">
           </select>
           <span class="field-validation-valid" data-valmsg-for="County" data-valmsg-replace="true"></span>
         </div>
</div>

然后是我的视图模型:

$ns.viewModel = kendo.observable(
                dataSourceCountries: new kendo.data.DataSource(
                    transport: 
                        read: 
                            url: href('~/Api/GeographicApi/ListCountries'),
                            dataType: 'json'
                        
                    ,
                    schema: 
                        data: function (response)  return response.Data || ; 
                    
                ),
                dataSourceCounties: new kendo.data.DataSource(
                    transport: 
                        read: 
                            url: function ()  var combobox = $('#Country').data('kendoComboBox'), id = combobox !== undefined ? combobox.value() : 0; return href('~/Api/GeographicApi/ListCountiesByCountryId/' + id) ,
                            dataType: 'json'
                        
                    ,
                    schema: 
                        data: function (response)  return response.Data || ; 
                    
                ),
                refreshCounties: function (e) 
                    var countiesList = $('#County').data('kendoComboBox');
                    e.preventDefault();
                    countiesList.dataSource.read();
                
);
kendo.bind($('#content-wrapper'), $ns.viewModel);

如果您还没有找到解决方案,希望对您有所帮助...

【讨论】:

以上是关于KendoUI - 使用 MVVM 和远程数据时的级联下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

KendoUI MVVM:在 router.navigate 之后重新加载小部件

Kendo UI for jQuery使用教程:使用MVVM初始化

Kendo UI,使用 MVVM 时如何从 DOM 元素获取小部件对象?

Kendo UI:如何使用 MVVM 绑定设置工具提示的值

Kendo MVVM-使用数据显示绑定布局

KendoUI Grid 服务器分页