我发现在我的应用程序中我重复了以下模式(见下面的代码)。 我必须为第一次加载调用BindMyEvents(true),然后为后续数据检索调用BindMyEvents(false)。
它是懒惰加载的,所以我不希望将数据序列化到HTML源代码中。有没有比将布尔标志传入我的Bind()方法更好的方法?是否有标准模式来实现淘汰?
我在想我是否应该在视图模型定义中设置viewAlertsModel.alerts = null,然后让Bind函数检查它。如果设置为null,则调用映射方法,然后调用applyBindings()?
function BindMyEvents(initialMap) {
// get alerts, map them to UI, then run colorbox on each alert
$.getJSON("/Calendar/MyEvents/", {},
function (data) {
if ( initialMap ) {
// set-up mapping
viewAlertsModel.alerts = ko.mapping.fromJS(data);
ko.applyBindings(viewAlertsModel,$("#alertedEventsContainer")[0]);
} else {
// update
ko.mapping.fromJS(data, viewAlertsModel.alerts);
}
});
}
答案 0 :(得分:0)
我会为不同的流程重新安排您的代码。
首先 - 定义一次数据。
viewAlertsModel.alerts = ko.observable();
其次,绑定您的数据
ko.applyBindings(viewAlertsModel,$("#alertedEventsContainer")[0]);
第三,现在使用您的数据
$.getJSON("/Calendar/MyEvents/", {},
function (data) {
ko.mapping.fromJS(data, viewAlertsModel.alerts);
});
在初始化阶段可以完成第一步和第二步。这里的关键是首先将viewAlertsModel.alerts
定义为可观察的。
第三步是您的运行时代码。现在,您的初始化代码与运行时代码完全分开。这就是正常的淘汰赛风格。
关于您对使用ko-mapping的评论,我使用以下代码
var tempVar = ko.mapping.fromJS(data);
viewAlertsModel.alerts(tempVar); // !important - do not use = operator.
这是大多数人使用的惯例。您对ko-mapping的使用通常用于特殊情况。