我开始使用挖空映射,我错过了一些明显的东西?
进行 AJAX 调用时,绑定将失败,因为尚未返回数据。一种方法是设置一个空的 JSON 响应来预填充视图模型,但对我来说这似乎不对。如果可以删除对初始空 JSON 对象的要求,那就太好了。
有办法解决这个问题吗? 写到这里,我开始考虑将绑定延迟到第一个 JSON 查询返回之后。
谢谢
这是一个精简的例子...
$(function () {
$(function () {
function userposition(position, sduid, userName) {
this.position = ko.observable(position);
this.userId = ko.observable(sduid);
this.userName = ko.observable(userName);
}
function overallTablesViewModel() {
this.userpositions = ko.observableArray([]);
var userpositions = this.userpositions;
var options = {};
this.FilterClick = function () {
options =
{
Prop1: value,
Prop2: value
};
if (sportId < 1) {
toastr.error('You need to select a sport.');
return;
}
$.getJSON('url', options, function (json) {
var mappedData = ko.utils.arrayMap(json, function (up) {
return new userposition(up.Position, up.SDUID, up.UserName);
});
userpositions(mappedData);
});
};
}
//set up the viewmodel
var viewModel = new overallTablesViewModel();
ko.applyBindings(viewModel, $("#overallTablevm")[0]);
});
});
我的示例是使用单击事件,但您可以将其删除。 您可以看到,ViewModel
调用url
,返回的json
构建了userposition
的observableArray
。
然后,视图将具有保存数据的属性userpositions
。
我会使用一个 Knockout 模板,如模板绑定文档中所述。基本方法是获取绑定到 AJAX 调用结果的当前 HTML,并将其移动到模板中。
然后,您在顶级视图模型上拥有一个属性,即通过 AJAX 调用获得的 JSON 结果:
<div data-bind="template: { name: 'my-template', data: myAjaxResponse}"></div>
问题再次出现,并重新搜索。
如果您向下滚动到"未定义的属性",我发现这个相当不错的淘汰提示页面建议在参数前面加上"$data"。
引用"在 JavaScript 中,尝试检索未定义的变量的值是错误的,但可以从另一个对象访问未定义的属性"
感谢您的帮助,但这是一个几乎看不见的轻量级修复。