knockout.js +后退按钮 - 绑定多次触发

时间:2013-11-22 09:13:20

标签: jquery-mobile knockout.js cordova

我有以下设置:knockout,phonegap,JQM。

我的申请基于http://propertycross.com/jquery-mobile/

直到现在我的应用程序才是一棵树'结构 - 即用户点击一个菜单条目,而当他想要一个不同的菜单条目时,他必须点击“返回”。按钮导航回主菜单。

但现在我要求用户可以从应用中的任何位置跳转到任何菜单条目。 但这会让后面的人感到困惑。功能,因为视图模型被新数据覆盖... 即

场景A:我显示菜单 - >用户点击entry1 - >我将applyBindings model1改为view1 - > view1显示带有entry2的链接 - >点击链接 - >我改变了model1中的值 - > view1显示新数据 - >用户点击返回 - > view1显示但数据错误

我尝试通过applyBindings解决新数据,但这会导致数据绑定处理程序多次触发。 即

方案B:我显示菜单 - >用户点击entry1 - >我将applyBindings model1改为view1 - > view1显示带有entry2的链接 - >点击链接 - >我将applyBindings model2用于view1-> view1显示新数据 - >点击处理程序多次启动......

我可以使用标志阻止多次执行 - 但我不想在我的代码中为每个函数执行此操作...

我认为可能有使用淘汰赛模板的解决方案,但我找不到合适的例子...

所以我的问题是:

  1. 淘汰/ phonegap / JQM不适合这种情况:循环应用结构+后退按钮?或者我错过了什么?

  2. 可以用模板解决吗?怎么样?

  3. 任何替代解决方案?

1 个答案:

答案 0 :(得分:0)

我的解决方案是:使用jQuery append()动态生成视图,例如:

$.each(acts, function (key, act) {
            if (!that.missionListViewModels[act.id]) {
                that.missionListViewModels[act.id] = new MissionListViewModel(application);
                $("body").append('<div data-theme="b" data-role="page" id="missionListView'+act.id+'"  data-url="missionListView'+act.id+'"  style="text-align:left;"><div data-bind="template: { name: \'missionListViewTemplate\', data: missionListModel }"></div></div>');
            }
}

注意:

  1. 我保留一个数组(that.missionListViewModels),引用动态创建的missionListViewModel以供将来参考。

  2. 为了保持append()中的代码简短,我使用了ko模板,但这不是必需的。

  3. JQM / KO模板不支持append():

    1. 通常由JQM生成的data-url缺失,因此我不得不手动添加它。

    2. 模板中的数据-i18n不起作用,我不得不使用data-bind =“text:...”而不是

    3. 'with'在模板内部无效,我不得不更改代码以避免它。