gpt4 book ai didi

typescript - Angular2,应用程序内所有其他组件的通用覆盖组件

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

我有以下两个组件:

覆盖

@Component({
selector: 'overlay',
template: '<div class="check"><ng-content></ng-content></div>'
})
export class Overlay {
save(params) {
//bunch of stuff that are commonly used
}
}

myComponent(还有很多这样的)

@Component({
selector: 'myComponent',
directives: [Overlay],
template: '<overlay><form (ngSubmit)="save({ name: 'sam', lastName: 'jones' })">I'm the component. Click <input type="submit">Here</input> to save me!</form></overlay>'
})
export class MyComponent {

}

这个解决方案在没有抛出错误的情况下不起作用,Angular2 只是跳过了两个组件的初始化。不管怎样,我想你明白了。有一个公共(public)组件需要包装许多其他组件,因此它需要是通用的。它有一个模板,因此服务无法完成这项工作。我对自定义注释的工作不多,也许他们可以做这样的事情?关于如何实现这样的功能有什么想法吗?

注意:覆盖层包含逻辑和模板,任何其他需要使用它的组件都需要这两者。该模板是一个复杂的模态对话框,带有动画、消息、淡入淡出等......这在整个解决方案中都很常见。

更新

找到这个:Angular2: progress/loading overlay directive

最佳答案

我为此特定任务创建了一个,并考虑将引导模式作为模板嵌入,但遇到了几个问题,例如引导模式中唯一有用的部分是类名。毫不奇怪,我不想为这个特定任务使用它,因为我需要区分组件上的窗口模态和进度模态。

叠加

@Component({
selector: 'overlay',
template:
`<div [ngClass]="isOpen ? 'opened' : 'closed'">
<div class="modal" role="dialog">
<div class="modalBody">
<div *ngIf="isSaving">
<span class="text-success text-bold">
Saving...
</span>
</div>
<div *ngIf="isSaved">
<span class="text-success text-bold">
Saved.
</span>
</div>
</div>
</div>
</div>`,
styles: [
'.modal { position:absolute; width: 100%; height: 100%; margin: -30px; background-color: rgba(255, 255, 255, 0.7); z-index: 1000; text-align: center; }',
'.closed { visibility: hidden; }',
'.opened { visibility: visible; }',
'.modalBody { top: 45%; left: 25%; width: 50%; position: absolute; }',
'.text-bold { font-weight: 800; font-size: 1.5em; }'
]
})
export class Overlay implements OnChanges, AfterContentInit {
@Input() isSaving: boolean = false;
@Input() isSaved: boolean = false;
@Input() containerElement: HTMLElement;

isOpen = false;

private modalElement;

constructor(private element: ElementRef, private animationBuilder: AnimationBuilder) { }

ngOnChanges() {
if (this.modalElement) {
if (this.isSaving == true || this.isSaved == true) {
this.toggleAnimation(true);
}
else if (this.isSaving == false && this.isSaved == false) {
this.toggleAnimation(false);
}
}
}

ngAfterContentInit() {
this.containerElement.style.position = 'relative';
this.modalElement = this.element.nativeElement.querySelector('.modal');
}

private toggleAnimation(isOpen) {
var startCss = { backgroundColor: 'rgba(255, 255, 255, 0)' };
var endCss = { backgroundColor: 'rgba(255, 255, 255, 0.7)' };

if (isOpen) {
this.isOpen = true

this.animation(
true,
this.modalElement,
400,
startCss,
endCss,
null
);
}
else {
this.animation(
isOpen,
this.modalElement,
400,
startCss,
endCss,
() => {
this.isOpen = false;
}
);
}
}

private animation(isStart, element, duration, startCss, endCss, finishedCallback) {
var animation = this.animationBuilder.css();

animation.setDuration(duration);

if (isStart) {
animation.setFromStyles(startCss).setToStyles(endCss);
} else {
animation.setFromStyles(endCss).setToStyles(startCss)
}

animation.start(element);

if (finishedCallback) {
setTimeout(finishedCallback, duration);
}
}
}

用法

照原样,您需要一个相对容器,以便 overlay 填充其父容器。 css 肯定需要修改以适应一些场景,例如移动设备和非定位容器。这是它目前的使用方式:

HTML

<form action="/edit" method="post" #myForm="ngForm" (ngSubmit)="save ajax method that will update the isSaving and isSaved accordingly" novalidate>
<div style="position: relative;" #overlayContainer>
<overlay [isSaving]="isSaving" [isSaved]="isSaved" [containerElement]="overlayContainer"></overlay>
</div>
</form>

保存 form 后,overlay 会在 containerElement 中显示 400 毫秒,然后淡出并隐藏,直到下一次保存试图。 isSavingisSaved 绑定(bind)值是希望使用 overlay 的任何组件的责任。

关于typescript - Angular2,应用程序内所有其他组件的通用覆盖组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37951516/

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