- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是一个关于如何使用 Angular 2 以“正确”方式实现所需功能的概念性问题。
我的应用程序有一个导航菜单、一个工具栏和一个内容区域。后者包含主要的 <router-outlet>
并显示不同的 View ,如列表和详细信息。
我想要实现的是工具栏显示不同的组件,具体取决于内容区域中呈现的组件/ View 。例如,列表组件需要工具栏中的搜索控件,而详细信息组件需要保存按钮。
A) 我的第一次尝试是添加另一个(命名)<router-outlet>
到工具栏,根据静态路由显示工具栏组件。这有什么不对的地方:
B) 我的第二次尝试是在主视图组件的 ngOnInit
中强制导航到工具栏组件(也使用命名的工具栏导出)。 ,它耦合得更紧密。什么味道不好:
ngOnDestroy
上的工具栏 socket ,但我还没有找到方法。C) 给路由器最后一次机会,因为我发现这种方法有效:
const ROUTES: Routes = [
{path: "buildings", children: [
{path: "", component: BuildingListComponent, pathMatch: "full", outlet: "primary"},
{path: "", component: BuildingListToolbarComponent, pathMatch: "full", outlet: "toolbar"},
{path: ":id", component: BuildingDashboardComponent, outlet: "primary"}
]}
];
想法是路由器会选择匹配路径每个导出。但是(不,它本来可以如此简单)不幸的是,这不起作用:
const ROUTES: Routes = [
{path: "buildings", children: [
{path: "list", component: BuildingListComponent, pathMatch: "full", outlet: "primary"},
{path: "list", component: BuildingListToolbarComponent, pathMatch: "full", outlet: "toolbar"},
{path: ":id", component: BuildingDashboardComponent, outlet: "primary"}
]}
];
它似乎(也可能是意外地)只适用于空路径。为什么,为什么?
D) 一个完全不同的策略是重新设计我的组件层次结构,以便每个主视图组件都包含一个适当的工具栏,并使用 multi-slot content projection .还没有尝试过,但我担心工具栏的多个实例会遇到问题。
有时候,这似乎是一个常见的用例,我想知道 Angular 2 专家将如何解决这个问题。有什么想法吗?
最佳答案
按照 Günter Zöchbauer(谢谢!)的建议,我最终向工具栏添加和删除了动态组件。所需的工具栏组件在路由的数据属性中指定,并由包含工具栏的中央组件(导航栏)评估。
请注意,导航栏组件不需要了解工具栏组件(在功能模块中定义)的任何信息。
希望这对某人有帮助。
buildings-routing.module.ts
const ROUTES: Routes = [
{path: "buildings", children: [
{
path: "",
component: BuildingListComponent,
pathMatch: "full",
data: {toolbar: BuildingListToolbarComponent}
},
{
path: ":id",
component: BuildingDashboardComponent,
data: {toolbar: BuildingDashboardToolbarComponent}
}
]}
];
@NgModule({
imports: [
RouterModule.forChild(ROUTES)
],
exports: [
RouterModule
]
})
export class BuildingsRoutingModule {
}
navbar.component.html
<div class="navbar navbar-default navbar-static-top">
<div class="container-fluid">
<form class="navbar-form navbar-right">
<div #toolbarTarget></div>
</form>
</div>
</div>
navbar.component.ts
@Component({
selector: 'navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.scss']
})
export class NavbarComponent implements OnInit, OnDestroy {
@ViewChild("toolbarTarget", {read: ViewContainerRef})
toolbarTarget: ViewContainerRef;
toolbarComponents: ComponentRef<Component>[] = new Array<ComponentRef<Component>>();
routerEventSubscription: ISubscription;
constructor(private router: Router,
private componentFactoryResolver: ComponentFactoryResolver) {
}
ngOnInit(): void {
this.routerEventSubscription = this.router.events.subscribe(
(event: Event) => {
if (event instanceof NavigationEnd) {
this.updateToolbarContent(this.router.routerState.snapshot.root);
}
}
);
}
ngOnDestroy(): void {
this.routerEventSubscription.unsubscribe();
}
private updateToolbarContent(snapshot: ActivatedRouteSnapshot): void {
this.clearToolbar();
let toolbar: any = (snapshot.data as {toolbar: Type<Component>}).toolbar;
if (toolbar instanceof Type) {
let factory: ComponentFactory<Component> = this.componentFactoryResolver.resolveComponentFactory(toolbar);
let componentRef: ComponentRef<Component> = this.toolbarTarget.createComponent(factory);
this.toolbarComponents.push(componentRef);
}
for (let childSnapshot of snapshot.children) {
this.updateToolbarContent(childSnapshot);
}
}
private clearToolbar() {
this.toolbarTarget.clear();
for (let toolbarComponent of this.toolbarComponents) {
toolbarComponent.destroy();
}
}
}
引用资料:
https://vsavkin.com/angular-router-understanding-router-state-7b5b95a12eab
https://engineering-game-dev.com/2016/08/19/angular-2-dynamically-injecting-components
Angular 2 dynamic tabs with user-click chosen components
Changing the page title using the Angular 2 new router
关于 Angular 2 : Display different "toolbar" components depending on main navigation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41036566/
我知道这类问题已经得到解答,但就我而言,我已经尝试了所有配置,但仍然不起作用。我需要对我的配置有一个新的看法(我确信我错过了一些东西)。两个附加程序都会记录所有级别 我想将所有包的信息 >= 记录到控
我正在对 Windows 移动设备上的代码性能进行一些基准测试,并注意到某些算法在某些主机上的表现明显更好,而在其他主机上则明显更差。当然,考虑到时钟速度的差异。 供引用的统计数据(所有结果均由同一个
我有一个程序可以计算多边形的面积和周长。程序还会确认面积和周长的计算结果是否与预期结果相同。 我不明白发生了什么,但确认面积和周长是否与预期相同的验证部分无法正常工作。 例如,我现在测试并在所有情况下
Codepen :(对于那些想直接进入的人来说,这是一个代码笔。在 Chrome 和 IE 中尝试一下,看看结果的不同) 我正在尝试使用 css3 转换/过渡,因为它们比 jquery 效果更流畅。
我有几个不同的正则表达式要在给定文本中匹配和替换。 regex1 :如果文本包含单词“Founder”,则将所有文本替换为首席执行官 正则表达式2:如果文本包含9位数字,则将其替换为NUM 我尝试使用
我编写了多线程应用程序,它从每个线程的数据库连接到一些电子邮件帐户。我知道 JavaMail 没有任何选项可以使用 SOCKS5 进行连接,因此我决定通过 System.setProperty 方法使
如您所见,这是我当前 Storyboard的不同设备预览。底部的透明绿色被另一个 View Controller 占用,但需要为每个不同的尺寸类固定间距。我尝试将 Storyboard 中的宽度和高度
我正在创建一个游戏,我需要能够改变玩家 Sprite 的速度。我认为最好的选择是通过重力影响 Sprite 。为了给用户运动的感觉,我希望背景以完全相同的速度向相反的方向移动。 我怎样才能给背景一个不
我正在查看BTrees库并注意到有多个 TreeSet (和其他)类,例如 BTrees.IOBTree.TreeSet BTrees.OOBTree.TreeSet BTrees.LFBTree.T
我有一个小型 C++ 库,必须为 armeabi 和 armeabi7a 编译。我还有一个非常大的 c++ 库,只需要为 armeabi 编译。现在正在为两种架构编译它们(使用 NDK),但这使我的
我需要根据站点的当前部分稍微更改主题。 似乎 MuiThemeProvider 只在加载时设置 muiTheme;但需要在 props 变化时更新。 如何做到这一点? 最佳答案 您可以尝试将主题放在包
如何创建两个每个都有自己的计数器的 lSTListing 环境? 如果我使用例如 \lstnewenvironment{algorithm}[2]{ \renewcommand\lstlist
我想使用 Travis-CI 和 Github 基于分支设置部署。 IE。 - 如果我们从 develop 构建- 然后执行 /deploy.rb使用 DEV 环境主机名,如果 master - 然后
我有一个带有数据验证的 WPF MVVM 数据表单窗口。很多控件都是文本框。目前,数据绑定(bind)触发器设置为默认值,即。 e.失去焦点。这意味着仅在可能完全填写字段时才对其进行验证。所以当删除一
我有许多应用程序的内容页面,并最终为每个内容页面编写了很多 View 模型。例如。如果我有一个包含项目组的列表,我将有一个 ShowAllViewModel并绑定(bind)到内容页面和列表中单个项目
我有一个通用 View 和 4 个其他 View 。我在通用 View 中使用 Bootstrap 选项卡(导航选项卡)。我希望其他 4 个 View 成为通用 View 中 4 个选项卡的内容。由于
我希望针对 Maven 发布插件的不同目标有不同的配置选项。故事是这样的: 我正在将 Git 用于 SCM。我希望release:prepare插件在本地完成所有操作,并让release:perfor
我正在为一个项目使用AbstractTableModel制作一个自定义TableModel,并且我需要找到一种方法让复选框显示在某些行上,而不是其他行上。我已经实现了 getColumn 方法,但我希
摘自《Javascript 忍者的 secret 》一书: EVENTS ARE ASYNCHRONOUS Events, when they happen, can occur at unpredi
我正在尝试配置我的第一个 GWT 记录器,到目前为止,我已经将日志消息打印到我的 JS 控制台(FF 的 Firebug): 最终,我希望非SEVERE 消息转到consoleHa
我是一名优秀的程序员,十分优秀!