带有 angular2 的非 SPA

2024-01-17

我开始使用 Angular2(带有 Express.js 后端),目的是将页面的几个部分的控制权传递给 Angular2 组件,但我最终意识到,当 Angular2 控制页面的整个区域时,系统会更有效。但是,我的应用程序不是 SPA,除了保存 Angular2 根组件选择器的路由之外,还有其他服务器渲染的路由。

我有两个问题,后面是代码片段:

  1. 每当我加载服务器控制的路由,其服务器端渲染模板不包含我的根组件的选择器时,<main-comp></main-comp>, angular2 基本上会吐到控制台,说它没有任何地方可以初始化。我将所有 Angular2 初始化代码放在整个应用程序的共享标头中。如果页面上不存在选择器,有没有办法告诉 Angular2 根组件不要渲染自身?

  2. 渲染 Angular2 根组件的服务器端路由是/writing特定博客文章的 angular2 路由 URL 类似于/writing/2016/03/post。但是,每当我直接浏览到该 URL 时,System.js 都会尝试加载相对于该位置的 app/boot,即/writing/2016/03/app/boot,这显然会失败并返回 404。我认为发生这种情况是因为我的服务器控制了/writing相对于向服务器请求的基本 URL 的路线和角度负载。因此,我所知道的唯一解决方案是将我的应用程序转变为 SPA,其中单个服务器路由为'/',这将需要对前端进行大量重写。我该如何解决这个问题?

这是我的根组件:

@Component({
    selector: 'main-comp',
    template: '<router-outlet></router-outlet>',
    providers: [TagService, PostService, BlogStateService],
    directives: [ROUTER_DIRECTIVES, BlogComponent]
})
@RouteConfig([
    {path: '/writing/...', name: 'Blog', component: BlogComponent }  
])
export class AppComponent {
    constructor(private _blogState : BlogStateService, 
        private _postService : PostService) {
    }
}

这是<head>元素:

<head>
    <script src="/js/jquery.min.js"></script>
    <script src="/js/modernizr-2.6.2-respond-1.1.0.min.js"></script>

    <!-- Angular Dependencies -->
    <script src="/app/node_modules/angular2/bundles/angular2-polyfills.js"></script>
    <script src="/app/node_modules/es6-shim/es6-shim.js"></script>

    <script src="/app/node_modules/systemjs/dist/system.src.js"></script>
    <script src="/app/node_modules/moment/moment.js"></script>

    <script>
        System.config({
            packages: {
                app: {
                    format: 'register',
                    defaultExtension: 'js'
                },
                moment: {
                    main: 'moment.js',
                    type: 'cjs',
                    defaultExtension: 'js'
                }
            },
            map: {
                moment: '/app/node_modules/moment/'
            }
        });
    </script>

    <script src="/app/node_modules/rxjs/bundles/Rx.js"></script>
    <script src="/app/node_modules/angular2/bundles/angular2.dev.js"></script>
    <script src="/app/node_modules/angular2/bundles/http.dev.js"></script>
    <script src="/app/node_modules/angular2/bundles/router.dev.js"></script>

    <script>
        System.import('app/js/boot').then(null, console.error.bind(console)); 
    </script>
    <base href="/">

</head>

对于第一个问题,我添加了对是否存在的检查<main-comp>在调用引导方法之前的页面上(感谢@Gunter 的想法)。

对于上面的第二个问题,我在 system.js 配置中添加了引导文件的路径,如下所示,以便 system.js 不会加载相对于请求 URL 的 app/boot 。

    System.config({
        packages: {
            app: {
                format: 'register',
                defaultExtension: 'js'
            },
            moment: {
                main: 'moment.js',
                type: 'cjs',
                defaultExtension: 'js'
            }
        },
        map: {
            app: '/app',   //<----------added this line
            moment: '/app/node_modules/moment/'
        }
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 angular2 的非 SPA 的相关文章

随机推荐

  • 不带参数的 Spring Integration Gateway

    在我的网关上 我有一个方法 Gateway String commsTest 我的想法是 我可以从 bean 调用 commsTest 并使用 spring 集成将其连接到将检查通信的服务激活器 当我这样做时 我会得到一个receive i
  • .Net 中的模拟弹性搜索响应

    我有 Elastic Search Nest 库代码 需要模拟我从弹性搜索索引获得的响应 var obj service Search
  • font-size 为 62.5% 的 html 和 em 计算

    我有点困惑 希望有人能解释这种行为 我有以下代码
  • Google Play 登录 Unity

    我正在尝试集成 Google play 服务 以便我可以在游戏中获得成就和排行榜 我尝试了以下代码 public Text myText void Awake PlayGamesPlatform Activate public void S
  • 将自定义属性添加到 app.config 中的自定义提供程序配置部分

    我正在关注这篇精彩的文章 in NET 基本上 本文详细解释了如何最终得到如下所示的配置文件
  • 将 Swift 字典转换为字符串

    为了测试和调试 我尝试将字典的内容放入字符串中 但不知道它将如何实现 是否可以 如果是 如何 字典是从网络服务获取的 所以我不知道它的键值 我想使用应用程序中的数据 在 Objective C 中 足以在 NSString 中存储任何内容
  • 如何在不使用 API 的情况下以编程方式执行搜索?

    我想创建一个程序 将字符串输入到 Google 等网站的文本框中 不使用其公共 API 然后提交表单并获取结果 这可能吗 我认为抓取结果需要使用 HTML 抓取 但是如何在文本字段中输入数据并提交表单呢 我会被迫使用公共 API 吗 难道这
  • NPM 错误!当我运行创建反应应用程序时代码完整性

    我尝试启动一个新的反应项目 但不断收到此错误 npm ERR code EINTEGRITY npm ERR errno EINTEGRITY npm ERR Invalid response body while trying to fe
  • 如何在 Android 中从 Drawable 将图像附加到彩信?

    我想将资源 可绘制文件夹中的图像附加到彩信 是否可以将可绘制文件夹中的图像附加到彩信 如果是 请在此处提供一些代码 我尝试了很多 也在这里找到了很多 以及在谷歌上但仍然无法获得正确的解决方案 请有人帮助我解决这个问题 提前致谢 我的代码如下
  • 检查R中的值是否==整数(0)[重复]

    这个问题在这里已经有答案了 我正在使用grepR 中的函数检查是否满足条件正则表达式 我所拥有的是这样的 grep expression string 一个例子可能是 value grep s A z value 哪个输出 整数 0 我想要
  • 具有绝对导入的 Rollup 和 Typescript 类型声明

    我正在制作 React 组件库 项目结构是这样的 src components utils hooks 现在我尝试使用汇总生成类型 d ts 文件 类型是生成的 但例如我的组件NumberInput正在使用绝对导入Input像这样的组件 i
  • React 与 ReactDOM?

    我有点新的反应 我发现我们必须导入两件事才能开始 React and ReactDOM 任何人都可以解释其中的区别 我正在阅读反应文档 https reactjs org docs 但它没有说 React 和 ReactDOM 最近才被分成
  • C++ cout 不显示任何内容

    什么可以解释为什么 cout 在此代码中没有显示任何内容 我知道它与 v 0 1 行有关但我不知道为什么 有人有解释吗 编辑 我也知道改变 v 0 1 对于 v push back 1 会解决问题 include
  • FreeTDS 不使用配置的 tds 版本

    freetds v0 91 tds 版本不匹配 我想在 Ubuntu 14 04 上连接到带有 FreeBSD 的 Windows SQL Server FreeTDS 使用 apt get 安装 我使用以下命令尝试了不同的 tds 版本
  • iexpress 生成的可执行文件在 XP 上不是有效的 win32 应用程序

    我使用的是 c windows syswow64 中的 32 位 iexpress exe 生成的 exe 文件在 Windows 7 和 Windows 8 x64 上运行良好 我可以确认它是 32 位应用程序 然而 当尝试在 XP 上运
  • 用C语言访问Gmail

    python 有等效的吗libgmail http libgmail sourceforge net in C Edit 我正在努力实现相当于GmailFS http en wikipedia org wiki GmailFS在C 如果您能
  • 使用knitr时无法让LyX生成不在同一行的两个图

    这里是针织新手 喜欢这个包 一切都很顺利 除了在 LyX 中编译后两个图不会并排出现 不确定发生了什么 因为我正在逐字复制 knitr 图形手册 knitr graphics lyx 中的示例 我的 LyX 代码 在图形浮动中 lt
  • Spring boot:排除一些自动配置的bean

    我有一个使用 spring kafka 的 Spring boot 项目 在这个项目中 我构建了一些包装 spring kafka beans 的事件驱动组件 即 KafkaTemplate 和 ConcurrentKafkaListene
  • 如何通过.NET/C# 查找CPU 核心数?

    有没有办法通过 NET C 找出CPU核心数 PS这是一个直接的代码问题 而不是 我应该使用多线程吗 问题 您可以获得与处理器相关的多种不同信息 物理处理器数量 核心数 逻辑处理器的数量 这些都可以不同 如果机器具有 2 个支持超线程的双核
  • 带有 angular2 的非 SPA

    我开始使用 Angular2 带有 Express js 后端 目的是将页面的几个部分的控制权传递给 Angular2 组件 但我最终意识到 当 Angular2 控制页面的整个区域时 系统会更有效 但是 我的应用程序不是 SPA 除了保存