我遇到一种情况,Angular 认为它需要重新创建组件,而不仅仅是使用旧组件,这会导致组件在将组件拖到界面中的另一个位置后“刷新”。我有一棵树,我可以从中生成组件。以下是我的树的简化版本:
{
"left": {
"type": "FirstComponent"
},
"right": {
"left": {
"type": "SecondComponent"
},
"right": {
"type": "ThirdComponent"
}
}
}
Run Code Online (Sandbox Code Playgroud)
将组件拖动到另一个位置后:
{
"left": {
"left": {
"type": "FirstComponent"
},
"right": {
"type": "ThirdComponent"
}
},
"right": {
"type": "SecondComponent"
}
}
Run Code Online (Sandbox Code Playgroud)
我将组件动态插入到我的 DockComponent 中,如下所示:
private panelRef: ComponentRef<any>;
ngOnChanges() {
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.panel.type);
this.dynamicInsert.clear();
this.panelRef = this.dynamicInsert.createComponent(componentFactory);
}
Run Code Online (Sandbox Code Playgroud)
每当我更改树时,树都会重新生成,因此组件是从头开始构建的。我尝试将 this.panelRef.instance 保存在我的 dockTree 中,但 this.panelRef.instance 是只读的,所以我无法用它做任何事情。我尝试保存 this.panelRef.instance 并将 this.panelRef.instance 的所有属性设置为已保存实例的属性。这让一切都变得一团糟。
有没有办法在 Angular 中动态插入现有组件?
[编辑]
根据 Ilia 的回答,我尝试将 ViewRefs 保存在我的树中。 …
我有一个调用此功能的下载按钮:
public FileResult DownloadExport()
{
string fileName = "example";
// Activate 'In progress'
// Call to a function that takes a while
// Deactivate 'In progress'
return File(fileName, System.Net.Mime.MediaTypeNames.Application.Octet, Path.GetFileName(fileName));
}
Run Code Online (Sandbox Code Playgroud)
所以,我调用一个为我生成文件的函数.此功能需要一段时间,我不希望我的用户认为应用程序崩溃.这就是为什么我想在用户等待时显示"进行中"的原因.我该如何实现呢?
澄清:这个问题不是关于下载的进度,而是关于生成文件的函数的进度.
我正在我的图书馆Contexr上工作。我只是重构了我的应用程序以使用 Angular CDK Overlay 来显示上下文菜单,因此我不必再在实际应用程序中包含某些组件(少一个安装步骤)。
我曾经使用FlexibleConnectedPositionStrategy在元素下方创建一个下拉列表,该下拉列表将保留在页面内。此位置策略的创建类似于使用 ElementRef:
const positionStrategy = this.overlay.position()
.flexibleConnectedTo(elementRef)
.left(state.left + 'px')
.top(state.top + 'px');
Run Code Online (Sandbox Code Playgroud)
问题是我没有 ElementRef 可供参考。我的覆盖应该灵活地连接到我的 .left() 和 .top()。有没有办法用 FlexibleConnectedPositionStrategy 做到这一点?目前我正在尝试使用 GlobalPositionStrategy,但这并没有考虑到屏幕外的元素。
打开覆盖层的类:
@Injectable({
providedIn: 'root'
})
export class ContextMenuService {
private overlayRef: OverlayRef;
constructor(private overlay: Overlay, private injector: Injector) {}
public open(state: ContextState) {
const overlayConfig = this.getOverlayConfig(state);
this.overlayRef = this.overlay.create(overlayConfig);
const contextMenuRef = new ContextMenuOverlayRef(this.overlayRef);
this.attachDialogContainer(this.overlayRef, state, contextMenuRef);
}
private getOverlayConfig(state: ContextState) {
const positionStrategy = this.overlay.position()
.global()
.left(state.left …Run Code Online (Sandbox Code Playgroud) 在我的一个项目中,我正在尝试使用.htaccess重定向.我正在使用这样的重定向:
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
Run Code Online (Sandbox Code Playgroud)
但是,现在我想为重写规则添加一个例外.我希望http://example.com/admin/以相同的方式重定向,仅限于不同的目录.所有其他流量仍应转到公共目录.所以我添加了这样的重写条件:
RewriteCond %{REQUEST_URI} !/admin/
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
Run Code Online (Sandbox Code Playgroud)
这没有做到这一点.我仍然被重定向到公用文件夹.我也试过这个:
RewriteRule ^admin$ admin/ [L]
RewriteRule admin(.*) admin/$1 [L]
RewriteCond %{REQUEST_URI} !/admin
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
Run Code Online (Sandbox Code Playgroud)
这只会让事情变得更糟.我现在得到500内部服务器错误.
我现在一直在搜索几个小时,而且我有点厌倦了找到如何为某个文件夹添加例外的示例,但是没有显示如何将此流量重定向到另一个文件夹.你能告诉我我做错了什么,或者我可以尝试哪种其他方法?
我正在开发一个项目,我想根据dataGridView中的选择加载信息.我在表单的设计器中创建了一个dataGridView,我添加了这一行:
this.dataGridView1.SelectionChanged += methodToBeCalled;
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但我有一个讨厌的问题.大多数时候,当我开始申请时,选择一行后没有任何事情发生.然后,当我查看我的代码时,代码行完全消失了.
首先我认为有人提交了一些代码,但即使我不更新它也会消失.
消失的代码可能是什么原因(错误/视觉工作室设计)?我该怎么办呢?