【问题标题】:Best way to track initial mapping using KnockoutJs使用 KnockoutJs 跟踪初始映射的最佳方法
【发布时间】:2011-12-25 09:08:39
【问题描述】:

我发现在我的应用程序中重复了很多以下模式(请参见下面的代码)。 我必须调用 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);
                }

            }); 
}

【问题讨论】:

  • 你的问题回答了我的问题。我没有意识到 fromJS 函数上的第二个参数有一个选项,它指向一个现有的模型。感谢分享!

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


【解决方案1】:

我会为不同的流程重新安排您的代码。

首先 - 定义一次数据。

viewAlertsModel.alerts = ko.observable();

其次,绑定你的数据

ko.applyBindings(viewAlertsModel,$("#alertedEventsContainer")[0]);

第三,现在处理您的数据

 $.getJSON("/Calendar/MyEvents/", {},
        function (data) {
                ko.mapping.fromJS(data, viewAlertsModel.alerts);
         });

第一步和第二步可以在初始化阶段完成。这里的关键是首先将viewAlertsModel.alerts 定义为可观察对象。

第三步是您的运行时代码。现在,您的初始化代码与您的运行时代码完全分离。这更正常的淘汰赛风格。

编辑

关于您的 cmets 关于使用 ko-mapping,我使用以下代码

var tempVar = ko.mapping.fromJS(data);
viewAlertsModel.alerts(tempVar);  // !important - do not use = operator.

这是大多数人使用的约定。您对 ko-mapping 的使用通常用于特殊情况。

【讨论】:

  • 我试过你的建议,但它没有呈现任何东西。我尝试初始化为 ko.observableArray([]) 但这没有效果。我认为初始映射需要一些数据结构才能开始,以便它知道下次如何绑定?
  • 我得到它的工作,使用以下: ko.mapping.fromJS(data, null, viewAlertsModel.alerts);由于某种原因,为映射选项参数传递“null”会导致它工作。诶?!?
  • @jaffa - 我已经用我如何使用 ko-mapping 更新了我的答案。很高兴你成功了。
  • 您好,您添加的那段代码,这与上述 3 个步骤中的代码有何关联?谢谢
猜你喜欢
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2011-11-24
相关资源
最近更新 更多