使用 Route Resolve 进行 Angular 服务器端渲染

2024-02-25

我正在尝试使用 Angular (v4) 中的服务器端渲染来实现更好的 SEO。

事情按预期进行,直到我添加resolve在我的路线上。添加resolve导致 HTMLtitle查看源代码时保留其初始值。

我的模块:

import {
  Injectable,
  ModuleWithProviders,
  NgModule
} from '@angular/core';
import {
  ActivatedRouteSnapshot,
  Resolve,
  Router,
  RouterModule,
  RouterStateSnapshot
} from '@angular/router';
import {
  Observable
} from 'rxjs/Rx';

import {
  ArticleComponent
} from './article.component';
import {
  Article,
  ArticlesService,
  UserService,
  SharedModule
} from '../shared';

@Injectable()
export class ArticleResolver implements Resolve < Article > {
  constructor(
    private articlesService: ArticlesService,
    private router: Router,
    private userService: UserService
  ) {}

  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): any {
    return this.articlesService.get(route.params['slug'])
      .catch((err) => this.router.navigateByUrl('/'));
  }
}

const articleRouting: ModuleWithProviders = RouterModule.forChild([{
  path: 'article/:slug',
  component: ArticleComponent,
  resolve: {
     article: ArticleResolver
  },
  data: {
    preload: true
  }
}]);

@NgModule({
  imports: [
    articleRouting,
    SharedModule
  ],
  declarations: [
    ArticleComponent
  ],

  providers: [
    ArticleResolver
  ]
}) export class ArticleModule {}

我的组件:

import {
  Component,
  OnInit
} from '@angular/core';
import {
  ActivatedRoute,
  Router,
} from '@angular/router';
import {
  Title,
  Meta
} from '@angular/platform-browser';

import {
  AppComponent
} from '../app.component';

import {
  Article,
} from '../shared';

@Component({
  selector: 'article-page',
  templateUrl: './article.component.html'
})
export class ArticleComponent implements OnInit {
  article: Article;

  constructor(
    private route: ActivatedRoute,
    private meta: Meta,
    private title: Title
  ) {}

  ngOnInit() {
    this.route.data.subscribe(
      (data: {
        article: Article
      }) => {
        this.article = data.article;
      }
    );
    this.title.setTitle(this.article.title);
  }
}

我是 Angular SSR 的新手,因此非常感谢任何指导。


不要订阅路由数据,而是从快照中检索结果,如下所示:

this.route.snapshot.data['article']

您可能还需要注册ArticlesService在你的providers对于模块。

作为旁注,此导入:

import {
  Observable
} from 'rxjs/Rx';

是 RxJS 反模式。请改用以下导入:

import {Observable} from 'rxjs/Observable';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Route Resolve 进行 Angular 服务器端渲染 的相关文章

随机推荐

  • ggplot R 次要 y 轴的更改限制

    我有一个与此线程非常相似的问题在ggplot2中组合条形图和折线图 双轴 https stackoverflow com questions 41764312 combining bar and line chart double axis
  • 如何在 yii2 php 中添加 spinner/loader

    我想在我的其中一个表单中添加一个旋转器 加载器 场景很简单 当我按下create按钮 然后它将显示一个旋转器 加载器 点击创建按钮后 将调用 Web 服务 以便旋转器 加载器将从调用开始到调用结束显示 下面是我的控制器 m MetersIn
  • flutter for web:文本在底部被切断

    随着网络抖动 当我显示文本时 我的文本被剪切在底部 我尝试添加填充 但它不起作用 这个问题这个产品无处不在 甚至在文本字段上 new Container width menuRightWidthDesktop height getSize
  • 使用 Python xml.sax 解析 XML:如何“跟踪”您在树中的位置?

    我需要定期从我们的管理软件导出 XML 文件 这是我第一次在 Python 中使用 XML 解析 XML 与xml sax并不是很困难 但是 跟踪 您在 XML 树中的位置的最佳方法是什么 例如 我有一份我们的客户名单 我想通过 提取电话
  • EC2 Auto Scaling 组的实例刷新低于正常阈值

    我有一个 ASG 其所需 最小 最大数量为 1 1 5 个实例 我希望 ASG 仅用于滚动部署和区域故障转移 当我使用 MinHealthyPercentage 100 InstanceWarmup 180 启动实例刷新时 该过程从取消注册
  • 是否存在或将会存在 target_clones 属性的“全局”版本?

    我最近玩过target clones该属性从 gcc 6 1 及更高版本可用 这非常漂亮 但是就目前而言 它需要一种有点笨拙的方法 每个想要多版本化的函数都必须手动声明一个属性 这不是最佳的 因为 它将编译器特定的内容放入代码中 它要求开发
  • PyQt 连接到 KeyPressEvent

    某些小部件将允许我执行以下操作 self widget clicked connect on click 但正在做 self widget keyPressEvent connect on key 将失败 表明该对象没有属性 connect
  • C++ 数组的 matlab 风格索引

    我想知道以下 matlab 习语最有效的 C 实现是什么 假设我在matlab中有3个向量 x y和idx x 13 2 5 5 22 107 y 3 100 200 idx 1 2 5 我想用 y 的内容替换 x 的位置 1 2 和 5
  • Python 将数字列表与其他数字列表相加

    在Python中 是否有一种简单的方法将列表的单独数字添加到其他列表的单独数字 在我的代码中 我需要以与此类似的方式添加大约 10 个长列表 listOne 1 5 3 2 7 listTwo 6 2 4 8 5 listThree 3 2
  • Azure Web 作业已停止/中止

    我有一个持续运行的天蓝色网络作业 但日志表明周末它的状态更改为 已中止 然后 已停止 虽然我周末没有使用该网站 但我不确定为什么会发生这种情况 因为队列中仍然有很多消息需要处理 什么会导致连续的网络作业停止或中止 它有超时时间吗 多个错误的
  • 如何开发/实施适用于 iPad 的远程桌面应用程序? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • os.path.getsize 报告的文件大小末尾带有 L,为什么?

    import os sys def crawlLocalDirectories directoryToCrawl crawledDirectory os path join path subname for path dirnames fi
  • 无法访问 React 中的嵌套 JSON 对象

    我有一个简单的 React 组件 并尝试在中显示嵌套的 JSON 对象render React Component class NodeDetail extends React Component constructor props sup
  • yii2 ActiveRecord 通过计算查找 OrderBy

    尝试从我的数据库中获取描述 查询返回结果 但我想将结果排序为仅显示得票最高的结果 投票数应按upvoted列减去downvoted column description UnitDescription find gt where id un
  • 如何从 Mac 上的 Chrome 导出证书?

    如何从 Mac 上的 Chrome v37 导出安全证书 以前 我可以单击 URL 旁边的小锁图标 选择 连接 选择证书 然后会出现 导出 按钮 不再这样了 编辑 2019 年 4 月 3 日 我找到了解决方法 这是在 Chrome for
  • jQuery ajax 不适用于没有 www 的 url

    下面的 jQuery ajax 脚本在我的网站上不起作用 如果url是没有www的 我检查了 Firebug 它没有发送 ajax 调用 ajax type POST url http www mysite com beta product
  • 使用 like 语句与 $wpdb->prepare 显示通配符所在的哈希值

    我正在尝试使用通配符构建一个准备好的语句 但是我遇到了一个问题 其中百分比通配符似乎返回了通配符的哈希值 我不确定为什么 有问题的代码是 condition wpdb gt prefix posts post title LIKE s qu
  • 如何从 AWS 命令​​行工具更新 Elastic Beanstalk 应用程序?

    啊 我爱 恨AWS 那么 如何从命令行实际更新 Elastic Beanstalk 中的应用程序 边注 我尝试了 eb cli 安装破坏了我的 aws cli 安装 所以这不起作用 AWS 命令 行工具提供了update environme
  • 如何使用 RestKit 映射 XML 文本内容?

    我有一个像这样的 XML
  • 使用 Route Resolve 进行 Angular 服务器端渲染

    我正在尝试使用 Angular v4 中的服务器端渲染来实现更好的 SEO 事情按预期进行 直到我添加resolve在我的路线上 添加resolve导致 HTMLtitle查看源代码时保留其初始值 我的模块 import Injectabl