【问题标题】:Knockout: Load observable array with ajax on load淘汰赛:在加载时使用 ajax 加载可观察数组
【发布时间】:2018-11-08 03:55:41
【问题描述】:

我在将所选选项绑定回下拉菜单时遇到问题

这是我的代码:

@Html.SelectListFor(m => m.State,
new { data_bind = "options: availableStates,  optionsText: 'Name', 
                   optionsValue: 'Id', selectedOptions: selectedStates
    })

在我的页面加载时,我想在这个下拉列表中设置我的选项,所以我有以下淘汰代码:

 $.ajax({
            url: rootDir + "/Home/GetStates",
            type: "GET",                
            contentType: "application/json",
            success: function (data) {
                var jsonResult1 = JSON.parse(data);                    
                data1 = jsonResult1;
                for (key in jsonResult1) {
                    var item = {
                        Id: jsonResult1[key].Id,
                        Name: jsonResult1[key].Name
                    };
                    self.availableStates.push(item);
                }
            }
       });

  self.selectedStates = ko.observableArray(vmData.State || "");
  //vmData.State has the previous selected values from the db 

我的问题是当我调试上面的代码时,上面的 ajax 调用在最后执行,而 selectedStates 语句在之前执行。由于之后执行 ajax 调用,因此下拉列表为空,并且下拉列表中没有任何设置。

我可以直接将上面的 ajax 代码放在我的淘汰赛 js 文件中并加载 availablestates 可观察数组吗?

【问题讨论】:

    标签: javascript jquery ajax knockout.js


    【解决方案1】:

    您可以在视图模型中创建一个公共方法来处理 ajax 调用和推送到可观察的可用状态。当你实例化你的虚拟机时,你可以在 applyBindings 之前调用这个方法。

    编辑:可能是错字,但仍然:

    @Html.SelectListFor(m => m.State,
    new { data-bind = "options: availableStates,  optionsText: 'Name', 
                       optionsValue: 'Id', selectedOptions: selectedStates
        })
    

    数据绑定不是数据绑定

    【讨论】:

    • 我刚试过。同样的事情发生了,我的选定状态的 KO 代码首先执行,然后最后我对 ajax 的调用发生在填充可用状态的地方
    • self.selectedStates = ko.observableArray(vmData.State || "");将其移至 ajax 调用上方
    • 不确定,但这也不起作用。现在我尝试的是,我已将 ajax 调用移至我的 html,然后将从我的 ajax 返回中获得的值分配给一个隐藏变量。然后我在我的 KO 中使用这个值来填充我的可用状态。现在奇怪的问题是这仅在我的 chrome 调试窗口打开时才有效。当我关闭窗口并按原样运行我的应用程序时,这不起作用。我已经删除了我的缓存/cookie 等。甚至尝试通过发出各种警报进行调试。一个警报说我的隐藏变量是空的,因为状态 ddl 是空的。不知道这里发生了什么。
    • 这听起来像是时间问题 - 打开调试窗口并可能遇到断点会更改脚本的执行顺序。我建议您开始朝这个方向努力以使其发挥作用。
    • 无法通过这个,不知道这里发生了什么。如果我创建一个状态的硬代码列表,那么整个事情都可以正常工作。一旦我打了一个ajax调用,它就不起作用了。填充此数组的任何其他方式。
    猜你喜欢
    • 2012-09-08
    • 1970-01-01
    • 2014-05-13
    • 2015-10-05
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2013-05-01
    相关资源
    最近更新 更多