【问题标题】:The applyBindings() is too fast, called before Ajax request completesapplyBindings() 太快,在 Ajax 请求完成之前调用
【发布时间】:2011-11-17 15:14:12
【问题描述】:

请考虑以下 ViewModel sn-p:

var id, given1, given2;

$.get("testSynUfGet.aspx", null, function (data) {
    id = data.id;
    given1 = data.given1;
    given2 = data.given2;
}, 'json');
//alert('here');
ko.applyBindings(new viewModel(id, given1, given2));

似乎我通过$.get 的ajax 调用太慢或者ko.applyBindings() 太快了。无论哪种方式,似乎只有在我取消注释 alert('here'); 行时,淘汰赛才能正确绑定。

如果我留下评论,则不会填充任何控件。

各位,有什么想法吗?

我能想到的唯一解决方法是将.applyBindings 作为$.get 中函数回调的一部分,如下所示:

$.get("testSynUfGet.aspx", null, function (data) {
    ko.applyBindings(new viewModel(data.id, data.given1, data.given2));
}, 'json'); 

【问题讨论】:

  • 两个答案都有效,具体取决于您要达到的目标。
  • 只是想重温一下,相信我的第一个思路还是在同步编程的领域。正确的是第二个 - 使绑定成为异步过程的一部分。

标签: jquery ajax knockout.js


【解决方案1】:

您的解决方法是做事的正确方法。这是您的“成功”处理程序,在返回数据时调用它,这是填充您的视图模型并应用绑定的正确点。

【讨论】:

  • 感谢马克,我暂时将其标记为答案(我在淘汰赛方面相对较新)。
  • 我遇到了类似的问题,虽然我的数据已正确绑定到模型,但我的一些 UI 控件无法在模板中正确绑定。 (手风琴控件正在工作,但手风琴内部的日期选择器没有)解决方案是将设置我的日期选择器等的代码移动到我的“成功”后调用的函数中。还有什么需要注意的。 +1 马克,您的回答为我指明了正确的方向。
  • 这是正确的答案 - 但我想我会添加原因...... - $.ajax 调用是异步的,所以它直接进入下一行 - 应用绑定。通过将它放在回调中,它会在异步过程完成后被调用。最好的方法是将它放在 .success() 处理程序中,这样它只有在成功完成时才会这样做。
【解决方案2】:

只有在页面上只有一个 ajax 调用时,此解决方法才有效。我认为正确的解决方案是首先创建您的视图模型,其中 id、given1 和 given2 是可观察的(最初为空)。然后在 ajax 回调中,更改这些 observables 的值。

【讨论】:

    【解决方案3】:

    更真实的方法是在 viewmodel 对象中执行你的 ajax 调用并填充他的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多