gpt4 book ai didi

Angular 通用: dynamic imports for browser only

转载 作者:太空狗 更新时间:2023-10-29 18:08:55 24 4
gpt4 key购买 nike

是否可以根据条件导入模块?仅当 angular 2 通用应用程序在浏览器中呈现而不在服务器中呈现时,才专门导入外部模块。

这个问题与一些依赖于浏览器特性并且只能在浏览器中呈现的 PrimeNG 模块有关。最好在服务器呈现时省略它们,因为日历和其他组件对于 SEO 来说并不是很重要。

目前,如果关闭服务器渲染,我可以渲染日历组件。但是当我将下面的代码包含在我的 app.module.ts 中并打开服务器呈现时,服务器在 button.js 中产生错误“ReferenceError:事件未定义”。

import { CalendarModule } from 'primeng/components/calendar/calendar';
@NgModule({
...
imports: [
...,
CalendarModule
]
})

angular提供了一个isBrowser条件。

import { isBrowser } from 'angular2-universal';

但我不知道如何将它用于条件导入。真的有办法为模块做到这一点吗?

最佳答案

所以有一种方法可以在浏览器中渲染 PrimeNG 组件,并在服务器渲染时忽略它们。这些问题帮助我开始挖掘正确的方向:

angular-cli: Conditional Imports using an environment variable

How can I conditionally import an ES6 module?

在服务器呈现时,我使用模拟组件来呈现一个简单的输入字段并使用相同的选择器“p-calendar”。我在 app.module 中得到的最终代码。

...//other imports
import { isBrowser } from 'angular2-universal';

let imports = [
... //your modules here
];
let declarations = [
... //your declarations here
];

if (isBrowser) {
let CalendarModule = require('primeng/components/calendar/calendar').CalendarModule;
imports.push(CalendarModule);
}
else {
let CalendarMockComponent = require('./components/primeng/calendarmock.component').CalendarMockComponent;
declarations.push(CalendarMockComponent);
}

@NgModule({
bootstrap: [AppComponent],
declarations: declarations,
providers: [
... //your providers here
],
imports: imports
})

要使您的模拟组件支持 [(ngModel)] 绑定(bind),请使用本教程。 http://almerosteyn.com/2016/04/linkup-custom-control-to-ngcontrol-ngmodel

import { Component, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';

export const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CalendarMockComponent),
multi: true
};

@Component({
selector: 'p-calendar',
template: '<input type="text" class="form-control"/>',
providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR]
})
export class CalendarMockComponent implements ControlValueAccessor {

private innerValue: any = '';

private onTouchedCallback: () => void = () => {};
private onChangeCallback: (_: any) => void = () => {};

//From ControlValueAccessor interface
writeValue(value: any) {
if (value !== this.innerValue) {
this.innerValue = value;
}
}

registerOnChange(fn: any) {
this.onChangeCallback = fn;
}

registerOnTouched(fn: any) {
this.onTouchedCallback = fn;
}
}

关于 Angular 通用: dynamic imports for browser only,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40751383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com