gpt4 book ai didi

angular - 如何在 Angular2 中使组件普遍可访问

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

我基本上想创建一个自定义对话框组件,我可以在我的 Angular2 应用程序的任何地方使用它,而不管使用组件在应用程序树中的什么位置。为简单起见,我们将其称为我的 SayHello 组件。

考虑以下应用程序树:enter image description here

假设我希望SomeComponent.level3.component 调用SayHello.component 中的对话框。

在 Angular 1.x 中,我会将 RootScope 注入(inject) Controller 并以这种方式点亮对话框。现在,我明白(或多或少)对于 Angular2,您可以将事件(带有事件发射器)冒泡到组件树中,但是从 SomeComponent.level3.component 一直冒泡到树并向下到 SayHello 似乎很乏味。成分。

所以我想我会创建一个 SayHello 服务,我可以将其注入(inject)任何我想点亮我的对话的地方。这是我制定的代码草图。

我的应用程序.component.ts

import {SayHelloComponent} from "<<folder>>/sayHello.component";
import {BunchOfComponents} from "<<folder>>/bunchOfComponents";

@Component({
directives: [SayHelloComponent],
selector: "my-app",
templateUrl: `<bunch-of-components>Within this component exists
SomeComponent.level3.component </bunch-of-components>
<say-hello showdialog="{{showDialog}}" message="{{message}}">
</say-hello>`

})
export class myAppComponent {
showDialog = false;
message = "";

constructor(private sayHelloService: SayHelloService) {
this.showDialog = sayHelloService.showDialog;
this.message = sayHelloService.message;

}
}

SayHelloService.ts

import {Injectable} from 'angular2/core';

@Injectable()
export class SayHelloService {
public showDialog: boolean = false;
public message: string ="";

constructor() {

}

}

SayHello.component.ts

import {Component} from "angular2/core";
import {SayHelloService} from "<<folder>>/SayHelloService";
@Component({
directives: [],
selector: "say-hello",
template: "[do hello component]"
})
export class SayHelloComponent {
@Input() showdialog: boolean;
@Input() message: string;

constructor(private sayHelloService: SayHelloService) {

}
//This idea here is to detect change in showDialog
//If true then do an alert with the message
ngOnChanges(changes: { [propName: string]: SimpleChange }) {
var obj = changes["showdialog"];
if (obj !== null) {
if (changes["showdialog"].currentValue === true) {
alert(this.message);
this.sayHelloService.showDialog = false;
}

};
}

}

SomeComponent.level3.component

import {Component} from "angular2/core";
import {SayHelloService} from "<<folder>>/SayelloService";

@Component({
directives: [],
selector: "some-component",
template: "<button (click)='doHello()'>Do say hello</button>"
})
export class PageContactUsComponent {

constructor(private sayHelloService: SayHelloService) {

}


doHello(): void {
this.sayHelloService.message = "Hello world";
this.sayHelloService.showDialog = true;
}
}

应用启动.ts

import {bootstrap} from "angular2/platform/browser";
import {MyAppComponent} from "<<folder>/MyAppComponent";
import {SayHelloService} from "<<folder>>/SayHelloService";

bootstrap(MyAppComponent, [
SayHelloService
]);

不用说,这是行不通的。我没有收到任何错误,但是 SayHello.component 没有检测到“showdialog”值的任何变化……所以什么也没有发生。任何有关如何正确执行此操作的想法将不胜感激。

最佳答案

正如上面评论中提到的,

  • 在服务中放置一个 Observable(注意,不是 EventEmitter)
  • 在其他组件可以调用的服务上放置一个 showDialog() API/方法。 showDialog() 方法应该调用 next() 来发送事件。
  • 您的对话框组件可以订阅事件并在收到事件时取消隐藏/显示自身。

要在服务中包装 Observable,请参阅 this answer .

关于angular - 如何在 Angular2 中使组件普遍可访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34572539/

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