从 Knockout 中的 AJAX 调用映射 JSON



我开始使用挖空映射,我错过了一些明显的东西?

进行 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构建了userpositionobservableArray

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

我会使用一个 Knockout 模板,如模板绑定文档中所述。基本方法是获取绑定到 AJAX 调用结果的当前 HTML,并将其移动到模板中。

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

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

问题再次出现,并重新搜索。

如果您向下滚动到"未定义的属性",我发现这个相当不错的淘汰提示页面建议在参数前面加上"$data"。

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

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

最新更新