gpt4 book ai didi

Angular2/4 : Override component from another module

转载 作者:太空狗 更新时间:2023-10-29 17:20:50 26 4
gpt4 key购买 nike

我使用的是 angular 4.3,typescript 2.2

我想基于相同的代码库创建多个应用程序(网站)。所有网站都几乎相同,但其中一些可能有一些额外的/不同的 logc/模板。

我的想法是创建一个核心模块(主要包含组件),然后让应用程序使用该模块构建它,并根据需要重载:- 风格- 模板(完全替换模板,或只修改其中的一部分)

  1. 如何覆盖核心模块中使用的组件?

我只设法覆盖在路由中明确使用的组件,但我无法覆盖在核心模块的模板中直接调用的子组件。我需要动态注入(inject)这些组件吗?

  1. 在继承组件时,是否可以只覆盖父模板的一部分?

我想每个需要覆盖的模板部分都必须更改为核心模块中的组件(然后回到问题 #1 以在子应用程序中使用继承的组件)

谢谢

最佳答案

问题#1

这是一个对我有用的解决方案

第一步

我将所有核心组件放在核心应用程序的核心模块中。

第 2 步

我在核心应用程序中声明了以下 CustomModule 函数

declare var Reflect : any;

export function CustomModule(annotations: any)
{
return function (target: Function)
{
let parentTarget = Object.getPrototypeOf(target.prototype).constructor;
let parentAnnotations = Reflect.getMetadata("annotations", parentTarget);

let parentAnnotation = parentAnnotations[0];
Object.keys(parentAnnotation).forEach(key =>
{
if (parentAnnotation[key] != null)
{
if (typeof annotations[key] === "function")
{
annotations[key] = annotations[key].call(this, parentAnnotation[key]);
}
else if (typeof Array.isArray(annotations[key]))
{
let mergedArrayItems = [];
for (let item of parentAnnotation[key])
{
let childItem = annotations[key].find(i => i.name == item.name);
mergedArrayItems.push(childItem ? childItem : item);
}

annotations[key] = mergedArrayItems;
}
else if (annotations[key] == null)
{ // force override in annotation base
annotations[key] = parentAnnotation[key];
}
}
});

let metadata = new NgModule(annotations);

Reflect.defineMetadata("annotations", [metadata], target);
};
}

第 3 步

在另一个应用程序中,我创建了一个名为 InheritedModule 的不同模块,我创建了从 CoreModule 中的组件继承的组件。继承的组件必须与父组件具有相同的名称和相同的选择器。

第四步

我让 InheritedModule 继承自 CoreModule。 InheritedModule 是用上面的 CustomModule 注解声明的(不要使用 NgModule)

该新模块应声明并导出在步骤 3 中创建的组件

@CustomModule({
declarations: [ Component1, Component2 ],
exports: [ Component1, Component2],
bootstrap: [AppComponent]
})
export class InheritedModule extends CoreModule
{
}

第 5 步

在子应用中导入 InheritedModule。

自定义模块函数会合并两个模块的注解,当CoreModule的组件同名时用InheritedModule的组件替换

问题#2

我想每当我想覆盖核心应用程序中的部分 html 时,我都必须用小组件替换 html 模板。我暂时不接受答案,以防有人有更好的主意

关于Angular2/4 : Override component from another module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45190120/

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