2

当我从绑定到 MVVM 可观察对象的 Kendo 下拉列表中选择一个选项时,我收到错误“n.get 不是函数”。

observable 看起来像这样(这只是其中的一小部分):

var myObs = kendo.observable({ isBusy: false,

data: {
    LanguageGuid: '7e433f51-16e8-44e0-bf08-6843baa642bd',
    LanguageList: [
        { "Code":"English","Guid":"3aac23ff-36d3-405c-bf0c-531510a71c39" },  
        { "Code":"Afrikaans","Guid":"5bfe95f8-d8f8-4858-b214-9ffef84adfed" },  
        { "Code":"Zulu","Guid":"5a369509-1070-4f8a-9bdb-e4b4ca4e9590" }]
}

这是HTML:

<input type="text" value="7e433f51-16e8-44e0-bf08-6843baa642bd" name="LanguageGuid" id="LanguageGid" data-value-field="Guid" data-text-field="Code" data-role="dropdownlist" data-bind="source: data.LanguageList, value: data.LanguageGuid" class="valid">

其余字段完美绑定,MVVM 做得很好,只是不是这个列表。

编辑:我删除了阻止引发异常的列表的值绑定:

<input type="text" value="7e433f51-16e8-44e0-bf08-6843baa642bd" name="LanguageGuid" id="LanguageGid" data-value-field="Guid" data-text-field="Code" data-role="dropdownlist" data-bind="source: data.LanguageList" class="valid"> 

这似乎表明在绑定下拉列表的实际值时出现了问题。它可以设置原始值,但是在更改选择时会引发异常。

4

2 回答 2

2

最后我发现,当从 ajax 调用返回并且在将其绑定到视图之前,我没有将 JSON 对象转换为可观察对象。

$.ajax({
    url: rootPath + "/profile/editprofile",
    type: "GET",
    data: "clientCode=xxx"
})
.done(function (result)
{
    $("#viewEditorContent").html(result.html);

    that.data = kendo.observable(result.clientViewModel);

    that.editForm = $("#viewEditorContent form");

    $.validator.unobtrusive.parse(that.editForm);

    kendo.bind($("#viewEditorContent"), that);
})  

在 done 处理程序中,结果参数是具有 2 个属性的 JSON 对象:

  1. html 和
  2. 客户端视图模型

以前当我设置 that.data 时,我没有将其转换为可观察的剑道,如下所示:

that.data = result.clientViewModel; 

这就是为什么它在尝试访问名为“get”的函数时抛出异常的原因。

于 2014-04-03T10:07:49.097 回答
1

在我的情况下,我在不使用 kendo.observable 的set方法的情况下进行本地绑定并提供viewModel

像这样的东西:

viewModel = kendo.observable({ 
    listValues: null,
    selectedValue: null,
});

<script>
    $(document).ready(function () {
        viewModel.listValues = [...]; // Wrong way initializing the viewModel
    });
</script>

这样,dropDownList 可以正确显示 listValues,但是当您选择一个时,您会收到错误“n.get 不是函数”


解决方案:

使用kendo.observable的 set 方法填充viewModel.listValues

<script>
    $(document).ready(function () {
        viewModel.set('listValues', [...]); // Correct way initializing the viewModel
    });
</script>
于 2016-05-13T13:40:34.360 回答