如何防止Durandal在启动时(重新)加载页面?

时间:2014-02-26 13:44:58

标签: javascript url-routing durandal

假设我使用带有Durandal的标准SPA项目。路由是使用 pushState:true 。 一切都很顺利。

然而

我想生成完全准备好的页面(即在服务器上生成(例如,ASP.NET MVC))(用于SEO优化,以及最小化流量)。即, 页面生成不是这里的事情 :我只是使用服务器路由并生成适当的页面 - 而不是问题。 (例如,'mydomain.com/about/'页面)。

一切都很棒到目前为止

但是

现在,当页面加载时, Durandal 显然识别“关于”页面,再次开始从服务器加载 (在缓存的情况下,它不会,但如果我需要实际数据,我的服务仍然会获取数据,这是额外的请求+时间)。

所以,问题是我如何阻止重新加载 简单地将ViewModel绑定到已经存在的HTML (已经在服务器上呈现)并且是当前加载页面的一部分)?

(只是为了澄清它一次:主要是防止在启动时重复加载页面)

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试自定义viewEngine;特别是createView方法。

实际上,您必须预先检查您的视图是否已加载,然后返回一个解决您的视图的延迟声明;否则,从createView返回默认值。这些方面的东西:

define([
    "jquery",
    "durandal/viewEngine"
],
function($, viewEngine) {
    var defaultCreateView = viewEngine.createView;

    viewEngine.createView = function(viewId) {
        if (viewId == "about") {
            // Some jQuery expression to find your view
            var $about = $("#about");

            // Emulate what createView would have done when the view was loaded
            $about.setAttribute("data-view", viewId)

            // Return the view element as a resolved promise
            return $.when($about);
        }

        // View is not loaded - defer to default createView implementation.
        return defaultCreateView.call(this, viewId);
    };
});