【发布时间】:2014-09-23 06:52:24
【问题描述】:
有一些类似的问题,但没有帮助我解决我的问题。使用 AJAX 更新我的 viewModel 后,我无法在页面/视图上更新我的结果。如果我重新加载页面,我会收到有效的 AJAX 响应来更新视图,但当我单击 btnAdvancedSearch 时不会更新
我有简单的 HTML:
<div>
<input type="button" id="btnAdvancedSearch" data-bind="click: refresh" />
</div>
<div id="resultslist1" data-bind="template: { name: 'rest-template', foreach: restaurants }">
</div>
我在文件加载时绑定:
$(document).ready(function () {
ko.applyBindings(new RestaurantsListViewModel());
});
我的viewModel是这样的,在里面我调用了与按钮绑定的刷新
// Overall viewmodel for this screen, along with initial state
function RestaurantsListViewModel() {
var self = this;
self.restaurants = ko.observableArray([]);
var mappedRests = $.map($.parseJSON(sessionStorage.getItem('searchResults')), function (item) { return new Restaurant(item) });
self.restaurants = mappedRests;
self.refresh = function () {
updateRestaurantsList(); //Method executes AJAX and saves result to session.
var mappedRests2 = $.map($.parseJSON(sessionStorage.getItem('searchResults')), function (item) { return new Restaurant(item) });
self.restaurants= mappedRests2;
}
}
我在这里错过了什么?
谢谢
【问题讨论】:
-
第一个应该是
self.restaurants(mappedRests);。第二个是ajax,是异步的,需要在ajax的success回调中放入代码var mappedRests2 = $map(...); self.restaurants(mappedRests2);。 -
当我的 AJAX 完成后,结果会保存在 sessionStorage 中(一定是这样的)然后我从 sessionStorage 中填充 self.restaurants。这会是个问题吗?我的 console.log 显示已检索到值
-
你写的方式,
that two lines立即执行(在 ajax 从服务器接收数据之前),ajax 将在未来完成,updateRestaurantsList()不等待 ajax 完成。如果这听起来不熟悉,请阅读一些关于 ajax 的基本教程。 -
我知道你在说什么,并且会尝试从这里直接调用 ajax 并绑定成功。但是为了测试,我将 console.log 放在最后一行之前,它会打印出没有在页面上呈现的良好、有效和更新的对象。
-
你在ajax调用中使用
async:false选项吗? (jQuery 文档不推荐)如果你这样做,self.restaurants(mappedRests2);应该可以工作。
标签: ajax mvvm knockout.js viewmodel