在子jQuery移动页面中初始化knockoutjs内容

Posted

技术标签:

【中文标题】在子jQuery移动页面中初始化knockoutjs内容【英文标题】:Initializing knockoutjs content in child jquery mobile page 【发布时间】:2013-04-30 14:48:19 【问题描述】:

我知道有很多问题涉及 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("create") 工作。在随后的调用中,它会调用 trigger("refresh") (这对我不起作用。)但问题是每次我转到子页面时都会添加委托函数。所以在第一次加载子页面时,它会调用一次委托回调函数。如果我去回到主页面,再回到子页面,会调用两次委托回调,以此类推。

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

【问题讨论】:

我在使用 jQM 时遇到了很多问题,最终根本没有使用它。但是我通过为每个页面分配一个 id 并将 dom 元素作为参数传递给敲除解决了这个特定点,例如ko.applyBindings(viewModel, $("#mypage div:jqmData(role='content')[0])。 ***.com/questions/7342814/… 首先,使用$('#speeding').listview('refresh')并将.delegate替换为.on @Omar - 如果我这样做 $(document).on("#page-speeding", "pagebeforecreate", function () );然后根本不调用该函数... @jgillich - 感谢您的回复,但您在应用绑定时没有说清楚。您是在第一次加载时应用每个元素 id 的绑定,就像我在上面所做的那样(减去每个元素 id),还是使用 $(document).delegate 以某种没有我提到的问题的方式进行上面? 试试这个$(document).on('pagebeforeshow', '#page-speeding', function () 【参考方案1】:

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

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]);
        );
    );
);

【讨论】:

这正是我使用的。我在这个主题上做了很多搜索并阅读了无数的论坛帖子 - 没有更好的方法。他们制作了一个 JavaScript 框架,在 JavaScript 繁重的应用程序中效果不佳......

以上是关于在子jQuery移动页面中初始化knockoutjs内容的主要内容,如果未能解决你的问题,请参考以下文章

请使用jQuery实现页面中的div元素向右移动100px后回到初始位置的动画效果?

我应该花精力实现 knockoutjs 还是研究 jQuery Data Link [关闭]

移动 Safari 在 jquery.min.map 文件上使用 404 停止页面加载

如何使用 KnockoutJS 和 JQuery UI 创建自动完成组合框

如何使用 jQuery、RequireJS 和 KnockoutJS 创建基本的 TypeScript 项目

通过 Jquery Ajax 函数加载后不渲染 KnockoutJS 元素