【问题标题】:How to prevent Durandal to (re)load a page on startup?如何防止 Durandal 在启动时(重新)加载页面?
【发布时间】:2014-02-26 13:44:57
【问题描述】:

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

但是。

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

一切都很顺利到目前为止

但是。

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

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

(再次澄清一下:主要是防止在启动时重复加载页面)

谢谢!

【问题讨论】:

    标签: javascript url-routing durandal


    【解决方案1】:

    您可以尝试自定义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);
        };
    });
    

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 2018-07-04
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 2017-06-26
      相关资源
      最近更新 更多