Mat-autocomplete 面板应与主机输入宽度相同,或更宽,具体取决于内容
Mat-autocomplete panel should be the same width as host input, or wider depending on content
我有一个 angular 自动完成树组件,但自动完成面板宽度有问题。
我有两个要求可以单独解决但不能一起解决:
- 一旦内容比面板宽,面板就会变大。我为此使用了
[panelWidth] = "auto"
,并且效果很好。
- 面板应具有主机输入的最小宽度。也可以为此使用 panelWidth,但我失去了第一点的功能。
来自 ) 我看到我可以使用 [panelWidth] = "auto"
。
我知道我可以使用 css 样式
.mat-autocomplete-panel{min-width: "300px"}
但不知道如何获取具体输入的宽度
所以我使出了javascript。我在文档中看到 AutocompletePanel 公开了面板 ElementRef,但是这个值 似乎是未定义的 无论我做什么?用@ViewChild
获取这个值的正确方法是?
我有以下在 opened
事件上运行的代码。
<mat-autocomplete #autocomplete (opened)="opened()" [panelWidth]="auto" #auto="matAutocomplete">
@ViewChild("auto") autocomplete: MatAutocomplete;
@ViewChild("autoTreeInput") autoTreeInput: ElementRef;
opened = () => {
setTimeout(()=>{
let p = this.autocomplete.panel?.nativeElement; //always null because panel is undefi
console.log("opened", p, this.autocomplete);
if (!p ) return
p.style.minWidth =
this.autoTreeInput.nativeElement.getBoundingClientRect().width + "px";
},1000)
};
我已经查看了您的 stackblitz 示例。
看起来更像是一个 css 问题。
在 autocomplete-simple-example.css
文件上试试这个
.example-form {
min-width: 150px;
// max-width <-- remove it to use 100% of width
width: 100%;
}
.example-full-width {
width: 100%; // add this to use all width.
transition: width 0.5s ease;
}
.mat-focused {
width: 270px;
}
这里有一个工作示例:stackblitz
编辑
您可以将任何有效的 css 添加到 width css
。通过这种方式,添加了 calc(100% - 60%)
以使其固定为与 input
相同
.example-form {
min-width: 150px;
width: 100%;
}
.example-full-width {
width: 100%;
transition: width 0.5s ease;
}
.mat-focused {
width: 100%;
}
<mat-autocomplete (opened)="opened()" panelWidth="calc(100% - 60px)" </mat-autocomplete>
面板 elementRef 在 opened
事件触发后(而非开启时)出现。更具体地说,在面板添加到 DOM 之后。因此,只需添加一个 setTimeout
,我就可以在其中获取元素。不幸的是,这意味着元素以错误的宽度显示,然后跳转到输入的宽度。
可能有更好的解决方案,但这就是我现在要做的。
opened = ()=> {
let inputWidth = this.autoInput.nativeElement.getBoundingClientRect().width
setTimeout(()=>{
let panel = this.autocomplete.panel?.nativeElement;
if (!panel ) return
panel.style.minWidth = inputWidth + "px";
})
}
我有一个 angular 自动完成树组件,但自动完成面板宽度有问题。
我有两个要求可以单独解决但不能一起解决:
- 一旦内容比面板宽,面板就会变大。我为此使用了
[panelWidth] = "auto"
,并且效果很好。 - 面板应具有主机输入的最小宽度。也可以为此使用 panelWidth,但我失去了第一点的功能。
来自 [panelWidth] = "auto"
。
我知道我可以使用 css 样式
.mat-autocomplete-panel{min-width: "300px"}
但不知道如何获取具体输入的宽度
所以我使出了javascript。我在文档中看到 AutocompletePanel 公开了面板 ElementRef,但是这个值 似乎是未定义的 无论我做什么?用@ViewChild
获取这个值的正确方法是?
我有以下在 opened
事件上运行的代码。
<mat-autocomplete #autocomplete (opened)="opened()" [panelWidth]="auto" #auto="matAutocomplete">
@ViewChild("auto") autocomplete: MatAutocomplete;
@ViewChild("autoTreeInput") autoTreeInput: ElementRef;
opened = () => {
setTimeout(()=>{
let p = this.autocomplete.panel?.nativeElement; //always null because panel is undefi
console.log("opened", p, this.autocomplete);
if (!p ) return
p.style.minWidth =
this.autoTreeInput.nativeElement.getBoundingClientRect().width + "px";
},1000)
};
我已经查看了您的 stackblitz 示例。
看起来更像是一个 css 问题。
在 autocomplete-simple-example.css
文件上试试这个
.example-form {
min-width: 150px;
// max-width <-- remove it to use 100% of width
width: 100%;
}
.example-full-width {
width: 100%; // add this to use all width.
transition: width 0.5s ease;
}
.mat-focused {
width: 270px;
}
这里有一个工作示例:stackblitz
编辑
您可以将任何有效的 css 添加到 width css
。通过这种方式,添加了 calc(100% - 60%)
以使其固定为与 input
.example-form {
min-width: 150px;
width: 100%;
}
.example-full-width {
width: 100%;
transition: width 0.5s ease;
}
.mat-focused {
width: 100%;
}
<mat-autocomplete (opened)="opened()" panelWidth="calc(100% - 60px)" </mat-autocomplete>
面板 elementRef 在 opened
事件触发后(而非开启时)出现。更具体地说,在面板添加到 DOM 之后。因此,只需添加一个 setTimeout
,我就可以在其中获取元素。不幸的是,这意味着元素以错误的宽度显示,然后跳转到输入的宽度。
可能有更好的解决方案,但这就是我现在要做的。
opened = ()=> {
let inputWidth = this.autoInput.nativeElement.getBoundingClientRect().width
setTimeout(()=>{
let panel = this.autocomplete.panel?.nativeElement;
if (!panel ) return
panel.style.minWidth = inputWidth + "px";
})
}