初始化子jquery移动页面中的knockoutjs内容

时间:2013-05-06 19:19:14

标签: jquery-mobile knockout.js

我知道有很多问题涉及jquery mobile / knockoutjs集成,但我找不到解决了我的问题的线程。我有一个包含子视图模型的主视图模型,因此我在页面加载时初始化它,因为该事件仅在应用程序加载时触发:

var viewModel = null;

$(function () {
    console.debug("running init");
    viewModel = new ViewModel();
    ko.applyBindings(viewModel);
});

这在我的应用程序的第一页上效果很好,但是当我转到子页面时,knockoutjs内容没有显示,因为jquery mobile已动态加载html并且knockout不知道更新绑定的内容。我试图通过使用$(document).delegate函数来告诉它动态更新,但我正在努力实现它应该如何实现。

<ul id="speeding" data-role="listview" data-bind="foreach: speeding.items">
    <li>
        <h3 class="ui-li-heading" data-bind="text: Address"></h3>
        <p class="ui-li-desc" data-bind="text: Address2"></p>
        <p class="ui-li-desc" data-bind="text: PrettyDate"></p>
        <p class="ui-li-aside" data-bind="text: SpeedMph"></p>
    </li>

    <script type="text/javascript">
        var loaded = false;
        $(document).delegate("#page-speeding", "pagebeforecreate", function () {
            if (!loaded) {
                loaded = true;
                ko.applyBindings(viewModel);
            }
            else {
                $("#speeding").trigger("refresh");
            }
        });
    </script>
</ul>

我将委托函数放在它被调用的页面中,因为显然这是使用委托的要求。然后在第一次加载这个子页面时,我调用了ko.applyBindings(我只想在应用程序加载时调用它,但是我无法触发(“创建”)工作。在后续调用中它会调用trigger(“refresh”) (这对我不起作用。)但问题是每次进入子页面时都会添加委托函数。所以在第一次加载子页面时,它会调用委托回调函数一次。如果我去了回到主页面,然后回到子页面,它将调用委托回调两次,依此类推。

有人可以提供有关刷新子页面上的knockoutjs绑定的推荐方法的指导吗?

1 个答案:

答案 0 :(得分:0)

这最终为我工作。我不知道是否有更好的方法......

var viewModel = null;

$(function () {
    console.debug("running init");
    viewModel = new ViewModel();
    ko.applyBindings(viewModel);

    var pages = [
        "scorecard", "speeding", "leaderboard"
    ];
    _.each(pages, function (page) {
        $(document).on("pagebeforecreate", "#page-" + page, function () {
            console.debug("applying " + page + " bindings");
            ko.applyBindings(viewModel, $("#page-" + page)[0]);
        });
    });
});