Knockout.js 从AJAX调用中映射JSON

Knockout.js 从AJAX调用中映射JSON,knockout.js,mapping,Knockout.js,Mapping,我开始使用敲除映射,我遗漏了一些明显的东西 当进行AJAX调用时,绑定失败,因为数据尚未返回。 是设置一个空的JSON响应来预推viewmodel,但对我来说这似乎不正确。如果可以删除对初始空JSON对象的要求,那就好了 有办法吗?写这篇文章时,我开始考虑将绑定延迟到第一个JSON查询返回之后 谢谢我将使用淘汰模板,如文档中所述。基本方法是将当前绑定到AJAX调用结果的HTML移到模板中 然后,在顶级视图模型上有一个属性,即通过AJAX调用获得的JSON结果: <div data-bind

我开始使用敲除映射,我遗漏了一些明显的东西

当进行AJAX调用时,绑定失败,因为数据尚未返回。 是设置一个空的JSON响应来预推viewmodel,但对我来说这似乎不正确。如果可以删除对初始空JSON对象的要求,那就好了

有办法吗?写这篇文章时,我开始考虑将绑定延迟到第一个JSON查询返回之后


谢谢

我将使用淘汰模板,如文档中所述。基本方法是将当前绑定到AJAX调用结果的HTML移到模板中

然后,在顶级视图模型上有一个属性,即通过AJAX调用获得的JSON结果:

<div data-bind="template: { name: 'my-template', data: myAjaxResponse}"></div>

这里是一个简化的示例

$(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]);
    });
});
$(函数(){
$(函数(){
函数userposition(position、sduid、userName){
此位置=可观察的高(位置);
this.userId=ko.observable(sduid);
this.userName=ko.observable(用户名);
}
函数overallTablesViewModel(){
this.userpositions=ko.observearray([]);
var userpositions=this.userpositions;
var选项={};
this.FilterClick=函数(){
选择权=
{
建议1:价值,
建议2:价值
};
如果(运动ID<1){
toastr.error('您需要选择一项运动');
返回;
}
$.getJSON('url',选项,函数(json){
var mappedData=ko.utils.arrayMap(json,函数(up){
返回新的userposition(up.Position、up.SDUID、up.UserName);
});
用户位置(mappedData);
});
};
}
//设置viewmodel
var viewModel=新的全局表viewModel();
ko.applyBindings(viewModel,$(“#overallTablevm”)[0]);
});
});
我的示例是使用单击事件,但您可以将其去掉。您可以看到
ViewModel
调用
url
,返回的
json
构建了
userposition
observearray


然后,视图将有一个保存数据的属性
userpositions

问题又出现了,并重新搜索

我发现,如果向下滚动到“Undefined Properties”,它建议在参数前面加“$data”

引用“在JavaScript中,尝试检索未定义的变量的值是错误的,但从另一个对象访问未定义的属性是可以的”


谢谢您的帮助,但这是一个几乎看不见的轻量级修复。

您能显示您的
视图模型吗?你是怎么打这个AJAX电话的?我不明白这是怎么解决这个问题的?