当我从我的Kendo下拉列表中选择一个绑定到MVVM observable的选项时,我收到错误'n.get is not a function'。
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">
这似乎暗示在绑定下拉列表的实际值时出现问题。它用于设置原始值,但在更改选择时会引发异常。
答案 0 :(得分:2)
我最终发现,在从ajax调用返回并将其绑定到视图之前,我没有将JSON对象转换为observable。
$.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处理程序中,result参数是一个具有2个属性的JSON对象:
之前当我设置那个data时,我没有将其转换为kendo observable,如下所示:
that.data = result.clientViewModel;
这就是在尝试访问名为“get”的函数时抛出异常的原因。
答案 1 :(得分: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>