修复 JQM ajax 单页导航上的淘汰多个绑定

Posted

技术标签:

【中文标题】修复 JQM ajax 单页导航上的淘汰多个绑定【英文标题】:Fixing knockout multiple bindings on JQM ajax single page navigation 【发布时间】:2014-05-01 09:32:25 【问题描述】:

我正在开发一个 Windows 8 phonegap 应用程序。我也在使用 JQuery、JQuery Mobile、Knockout JS。我有点陷入普遍错误

您不能多次对同一个元素应用绑定

谷歌搜索给了我两个解决方案。

1)Ko.cleanNode(不建议这样做)

2)模板化(推荐方法)

我尝试使用推荐的模板方法,但仍然遇到同样的错误。

以下是我的 javascript 逻辑:

//Code for home.js

//My View model
function HomeViewModel() 
    var self = this;
    self.MyDaySchedule = [
         picture: "../../images/home/MyDaySchedule_video.png" ,
         day: "2", title: "Physical Activity after surgery", text: "you will have tasks each day to help gain strength. Complete self-assessments...", picture: "../../images/home/MyDaySchedule_b1.png" 
    ];

//Main Execution
function initialize() 
    console.log("Knockout activated");
    // Activates knockout.js

    ko.applyBindings(new HomeViewModel(), document.getElementById("#homePage"));

我将在我的 pageshow 事件中调用初始化函数。绑定将正确发生而不会出现任何错误,并且所有数据值都将在运行应用程序时显示。

以下是我使用基于模板的方法的 html 代码:

//home.html
//Binding one
   <div data-bind="template:  name: 'frame1data1-template', data: MyDaySchedule[0] ">  </div>
                            <script type="text/html" id="frame1data1-template">
                                <!-- Displays the "picture" field. -->
                                <img data-bind="attr:src: picture"
                                     id="frame1data1_img" draggable="false" />
                            </script>


//Binding two
<div data-bind="template:  name: 'frame1data2-template', data: MyDaySchedule[1] "></div>
                            <script type="text/html" id="frame1data2-template">
                                <img data-bind="attr:src: picture"
                                     src="#" id="frame1data2_img" draggable="false" />
                                <h1 id="frame1data2_daytext" class="disabletextselect">Day</h1>
                                <h1 id="frame1data2_dayvalue" class="disabletextselect" data-bind="text:day"></h1>
                                <h1 id="frame1data2_title" class="disabletextselect" data-bind="text:title"></h1>
                                <h1 id="frame1data2_text" class="disabletextselect" data-bind="text:text"></h1>
                                <input type="button" id="frame1data2_backpicture" data-role="none">
                            </script>

考虑单击上面的任何图像,我使用 $.mobile.navigate("new.html"); 导航到 new.html (完美地发生了)

当我使用 window.history.back() 从 new.html 导航回 home.html 时,我的错误发生了;这向我抛出了错误“您不能将绑定多次应用于同一元素”,因为尽管我使用模板方法再次调用了 ko.applyBindings()。

对于我的示例,是否有针对此错误的积极且合适的解决方法?

【问题讨论】:

我认为当您导航回主页时,绑定已经存在(在缓存中)并且再次调用了您的初始化方法,它显示了 multiplebinding.so 您可以调用 Ko.cleanNode() 之前ko.applyBindings 或您可以做的其他事情检查新呼叫或 window.history.back 呼叫。这是新的电话,然后只做 ko.applybinding。 Ko.cleanNode() 将起作用..但我必须将页面顶部元素(容器)作为元素传递给 ko.cleanNode(),这会冻结一些基于 css 的交互。我正在寻找 Ko.cleanNode() 的替代方法,例如我在这里使用的模板方法。对于您的评论...我也仅在我的示例中使用 window.history.back。 【参考方案1】:

我会将您的个人页面视图模型放入您的根视图模型中。然后只需对根视图模型应用一次绑定,并将data-bind="with: HomeViewModel()" 用于主页模板,其他页面也一样。

【讨论】:

以上是关于修复 JQM ajax 单页导航上的淘汰多个绑定的主要内容,如果未能解决你的问题,请参考以下文章

Jquery Mobile 滑块不工作 JQM 1.3.2 和 Jquery 1.10.2

是否无法为 $(document) 上的 jqueryui/jqm 小部件事件设置 on() 侦听器?

动态生成元素的淘汰数据绑定

当页面通过ajax作为部分加载时,如何重新绑定淘汰视图模型?

jQM在关闭对话框或导航回来时,再次触发事件

我可以以编程方式触发淘汰视图模型更新吗?