绑定下拉列表(选择)列表的初始/默认值

时间:2011-07-11 10:50:09

标签: javascript asp.net-mvc knockout.js

我在设置下拉列表的初始值方面遇到了一个小问题。下面的代码是视图模型定义和$(document).ready中的初始化。我有一个名为sourceMaterialTypes的数组和一个selectedSourceMaterialType表示该数组的选定值。我正在使用(ASP.Net MVC)Mod​​el和ViewBag中的值初始化视图模型。

var viewModel = {
    sourceMaterialTypes : 
        ko.observableArray(@Html.Raw(Json.Encode(ViewBag.SourceMaterialTypes))),
    selectedSourceMaterialType :
        ko.observable(@Html.Raw(Json.Encode(Model.SourceMaterialType))),
    ingredientTypes :
        ko.observableArray(@Html.Raw(Json.Encode(ViewBag.IngredientTypes))),
    selectedIngredientType : ko.observable()
};

$(document).ready(function () {

    ko.applyBindings(viewModel);

    viewModel.selectedSourceMaterialType.subscribe(function(newSourceMaterialType) {
        $.getJSON("/IngredientType/FindByMaterialType",
                  { "id": newSourceMaterialType })
            .success(function (data) {
                viewModel.ingredientTypes($.parseJSON(data));
            })
            .error(function () { alert("error"); });
    });
});

以下是具有Knockout绑定定义的下拉列表(select)列表的定义。

<select id="SourceMaterialTypeId"
        name="SourceMaterialTypeId"
        data-bind="options: sourceMaterialTypes,
                   optionsText: 'Name',
                   optionsValue : 'Id',
                   value: selectedSourceMaterialType"></select>

这一切都正常,除了源材料下拉列表中最初选择的值(selectedSourceMaterialType被正确绑定所以当下拉选项更改其值正确更新时,它只是初始选择我遇到了问题with),它始终是我视图模型中sourceMaterialTypes数组中的第一个项目。

我希望最初选择的值是从(服务器端)模型初始化的值,作为selectedSourceMaterialType视图模型属性的值。

3 个答案:

答案 0 :(得分:13)

我猜你只需要传递Id而不是selectedSourceMaterialType可观察功能中的整个对象 - &gt;

selectedSourceMaterialType: ko.observable(@Model.SourceMaterialType.Id)

答案 1 :(得分:5)

API为您提供了解决方案,您只需要在您的选择中添加optionsCaption。

<select id="SourceMaterialTypeId"
    name="SourceMaterialTypeId"
    data-bind="options: sourceMaterialTypes,
               optionsText: 'Name',
               optionsValue : 'Id',
               value: selectedSourceMaterialType,
               optionsCaption: 'Please select...'"></select>

答案 2 :(得分:1)

正如@nEEBz建议的那样,selectedSourceMaterialType初始化不正确。在learn.knockoutjs.com "Lists and Collections" tutorial中,它们通过传递可观察数组的特定索引的值来初始化其viewmodel的selected-item属性。例如,执行以下操作:

selectedSourceMaterialType: ko.observable(sourceMaterialTypes[2])

......而不是:

selectedSourceMaterialType: ko.observable({"Id":1,"Name":"Coffee Bean" /* ... */});

这样,所选项的值是对下拉列表项来自的同一可观察数组中的项的引用。