我有一个带有列表视图的 WinJS 应用程序,如果在列表视图完全加载之前在页面之间快速导航,则下一页显示列表视图,其中所有元素绑定为“未定义”。
假设我有一个带有“待办事项”的中心页面,该页面被过滤为仅显示 6 个项目,并且有一个标题导航到完整的“待办事项”页面,当显示中心页面但在它完全加载之前我单击“待办事项”页面的标题链接,然后应用程序转到“待办事项”页面,但项目显示在磁贴中的所有属性为“未定义”。
我使用 IndexedDB 作为我的数据存储。
我的主页代码如下所示:
WinJS.UI.Pages.define("/pages/home/home.html", {
ready: function (element, options) {
WinJS.Utilities.query("a").listen("click", function (e) {
e.preventDefault();
WinJS.Navigation.navigate(e.currentTarget.href);
}, false);
viewModel = new HomeViewModel(element);
viewModel.load(); //loads from indexed db
},
//etc...
待办事项页面:
WinJS.UI.Pages.define("/pages/ToDo/ToDo.html", {
ready: function (element, options) {
viewModel = new ToDoViewModel(element);
viewModel.load();
},
etc//
我知道没有什么可做的,但任何想法都会受到赞赏。
还有关于如何调试这样的东西的提示也会很棒。
更新
我从中心页面将其缩小到这一行:
myLib.GetData(todaysDate, function (result) {
that.trendsModel.today = result;
WinJS.Binding.processAll(that.el.querySelector("#dataPanel"), that.trendsModel); //<--Right Here
});
如果我删除它,那么当我加载第二页时,数据不会显示为未定义。有趣的是数据最初在第二页上正确显示,然后变为“未定义”。
解决方案
我的修复:
myLib.GetData(todaysDate, function (result) {
var element = that.el.querySelector("#dataPanel");
that.trendsModel.today = result;
if(element) {
WinJS.Binding.processAll(element, that.trendsModel);
}
});
当回调返回时,我已经在第二页了。所以没有找到选择器返回null。如果您将 null 传递给 processAll,它会尝试绑定整个页面,这就是为什么我能够在一秒钟内看到正确的数据,然后它会变为未定义......哇,真是太棒了。我想这是有道理的,但很难找到。
希望它在未来对某人有所帮助:)