使用KnockoutJs跟踪初始映射的最佳方法

时间:2011-11-09 14:40:01

标签: javascript knockout.js knockout-mapping-plugin

我发现在我的应用程序中我重复了以下模式(见下面的代码)。 我必须为第一次加载调用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);
                }

            }); 
}

1 个答案:

答案 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的使用通常用于特殊情况。