Angular 如何从createServerRender将数据注入服务器端?

Angular 如何从createServerRender将数据注入服务器端?,angular,typescript,asp.net-core,Angular,Typescript,Asp.net Core,我已经阅读了一些教程,但到目前为止,还没有一本足够深入(或足够新)来展示如何将数据真正传递到组件。这是我能得到的最远的距离: 在boot.server.ts中: export default createServerRenderer(params => { const providers = [ // default providers here { provide: 'MYDATA', useValue: params.data.myData }

我已经阅读了一些教程,但到目前为止,还没有一本足够深入(或足够新)来展示如何将数据真正传递到组件。这是我能得到的最远的距离:

boot.server.ts
中:

export default createServerRenderer(params => {
    const providers = [
        // default providers here
        { provide: 'MYDATA', useValue: params.data.myData }
    ];
    return platformDynamicServer(providers).bootstrapModule(AppModule).then(moduleRef => {
      // default implementation
    });
在组件中:

import { Component, Inject } from '@angular/core';
@Component({
    selector: 'nav-menu',
    templateUrl: './navmenu.component.html',
    styleUrls: ['./navmenu.component.css']
})
export class NavMenuComponent
{
    constructor(@Inject("MYDATA") myData: string) { }
}
但是,如果
没有“MYDATA”的提供程序,则此操作将失败

我能够将数据输入
窗口
,但这显然在
服务器端不起作用

我不确定是否需要将
MYDATA
添加为
app.module.server.ts
中的提供者,如果需要,如何添加。

如果您从未来(~2018年)阅读此内容,请改用


看起来客户端出现了此错误。您可能忘了为客户端的
MYDATA
指定提供者。我通常在app.module.browser.ts(以前称为app.module.client.ts)中执行此操作 例如:

@NgModule({
引导:[AppComponent],
进口:[
浏览器模块,
BrowserAnimationsModule,
AppSharedModule
],
供应商:[
{提供:'MYDATA',useFactory:getMyData}
]
})
导出类AppModule
{
}
/**
*从服务器端生成的dom读取状态
*/
导出函数getMyData()
{
const appState=document.querySelector(“应用程序状态”);
如果(应用状态)
{
返回JSON.parse(appState.textContent!);
}
返回null;
}
要保存服务器端状态,可以使用以下技术:

从'@angular/core'导入{Component,PLATFORM_ID,Inject};
从“@angular/common”导入{isPlatformServer};
@组成部分({
选择器:“应用程序状态”,
模板:“{state}json}”
})
/**状态分量*/
导出类状态组件
{
国家:任何;
/**州议员*/
构造函数(@Inject(平台ID)platformId:any)
{
if(isPlatformServer(platformId))
{
此.state={
道具:“服务器端确定的某些状态”
}
}
}
}
在app.component.html中,您可以像这样放置状态组件或添加条件以在客户端跳过它:


这个问题没有包含足够的信息。
providers
实际使用了吗?@estus我已经更新了这个问题,以说明如何使用
providers
<代码>默认实现
是ASP.NET Core 2 Angular模板创建的ok。我希望它能起作用。不清楚为什么会有这样的错误。考虑提供一种复制问题的方法,例如GITHUB RePo。ESTUS我正在开发一个开源项目,你能找到它吗?你有一个如何做的例子吗?我尝试了一下,结果出现了一个错误,比如
找不到字符串的提供者
或者类似的问题。问题是,我想将数据从服务器传递到浏览器,而不必在浏览器上再次获取数据(因此
getMyData
对我来说没有意义)。这可能吗?最后我注入了窗口并从中读取了值。我个人在服务器端将数据写入特殊组件,然后在客户端读取。我将在我的回答中举例说明。用你的角度,这是唯一的方法。但是他们已经为你做了一件新的事情。但这几乎是同样的事情,在未来很容易切换到这一解决方案。