如何使用 angular material 表单域和弹性布局
how to use angular material form field and flex-layout
我想在一行中有 2 个表单输入字段:
1.第一个有一个固定的,
1.第二个应该会变长变小,但是这个不会变小到180px以下。
这里是完整的stack-blitz example
当您启动应用程序时,我们会看到这个
可能还有其他问题:
我认为第二个输入字段应该已经显示提示文本和水平线 - 但它只会在获得焦点时显示。
这是预期的行为还是我遗漏了什么?
无论如何。主要问题是 第二个字段没有按预期收缩 。不会缩小到180px以下:
在 chrome 开发工具中,我可以看到 input
元素用 div class="mat-form-field-infix">
包裹,而 class mat-form-field-infix
有一个固定的宽度为 180px!
我想到的唯一 解决方法 是使用 ::ng-deep
.[=45= 覆盖此宽度]
您可以在 Stackblitz 示例的 co-input-field.component.scss 文件中激活它
:host ::ng-deep .mat-form-field-infix {
// width: auto !important;
width: unset !important;
}
使用此解决方法,第二个输入按预期缩小:
但是::ng-deep is deprecated并且会被删除。
那么使输入按预期收缩的正确方法是什么?
由于 .mat-form-field-infix 的宽度固定为 180px,因此无法使表单字段缩小到 180px 以上。不可避免地。mat-form-field-infix 必须被覆盖。
您可以通过几种方式使用 ::ng-deep 获得相同的结果;
1.disable 查看该特定组件的封装。但是,这种方法有一个很大的缺点,即组件中的所有样式都是全局的,因此需要谨慎管理。
@Component({
selector: 'app-co-input-field',
templateUrl: './co-input-field.component.html',
styleUrls: ['./co-input-field.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class CoInputFieldComponent {}
然后在 co-input-field.component.scss
中执行以下操作
app-co-input-field {
.mat-form-field-infix {
width: auto !important;
}
// all other component styles goes in here
// in order to keep them isolated from global scope
}
2.don不禁用视图封装。在全局样式中使用父组件的元素选择器。
将以下内容放入styles.scss
app-co-input-field {
.mat-form-field-infix {
width: auto !important;
}
// co-input-field.component.scss still can be used for encapsulated styles
}
3.don不禁用视图封装。为这种特殊情况定义一个全局规则。
将以下内容放入styles.scss
.shrinking-mat-form-field {
.mat-form-field-infix {
width: auto !important;
}
}
并将.shrinking-mat-form-field
class应用到相应的元素
<mat-form-field style="width: 100%" class="shrinking-mat-form-field">
<input matInput placeholder="placeholder" />
<mat-hint align="end">hint text</mat-hint>
</mat-form-field>
尽管第二种和第三种方法基本相同,但我个人更喜欢第三种方法,因为它可读性强,在整个项目中保持一致,副作用最小,并且可以从一个点进行管理。
我想在一行中有 2 个表单输入字段: 1.第一个有一个固定的, 1.第二个应该会变长变小,但是这个不会变小到180px以下。
这里是完整的stack-blitz example
当您启动应用程序时,我们会看到这个
可能还有其他问题:
我认为第二个输入字段应该已经显示提示文本和水平线 - 但它只会在获得焦点时显示。
这是预期的行为还是我遗漏了什么?
无论如何。主要问题是 第二个字段没有按预期收缩 。不会缩小到180px以下:
在 chrome 开发工具中,我可以看到 input
元素用 div class="mat-form-field-infix">
包裹,而 class mat-form-field-infix
有一个固定的宽度为 180px!
我想到的唯一 解决方法 是使用 ::ng-deep
.[=45= 覆盖此宽度]
您可以在 Stackblitz 示例的 co-input-field.component.scss 文件中激活它
:host ::ng-deep .mat-form-field-infix {
// width: auto !important;
width: unset !important;
}
使用此解决方法,第二个输入按预期缩小:
但是::ng-deep is deprecated并且会被删除。
那么使输入按预期收缩的正确方法是什么?
由于 .mat-form-field-infix 的宽度固定为 180px,因此无法使表单字段缩小到 180px 以上。不可避免地。mat-form-field-infix 必须被覆盖。
您可以通过几种方式使用 ::ng-deep 获得相同的结果;
1.disable 查看该特定组件的封装。但是,这种方法有一个很大的缺点,即组件中的所有样式都是全局的,因此需要谨慎管理。
@Component({
selector: 'app-co-input-field',
templateUrl: './co-input-field.component.html',
styleUrls: ['./co-input-field.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class CoInputFieldComponent {}
然后在 co-input-field.component.scss
中执行以下操作
app-co-input-field {
.mat-form-field-infix {
width: auto !important;
}
// all other component styles goes in here
// in order to keep them isolated from global scope
}
2.don不禁用视图封装。在全局样式中使用父组件的元素选择器。
将以下内容放入styles.scss
app-co-input-field {
.mat-form-field-infix {
width: auto !important;
}
// co-input-field.component.scss still can be used for encapsulated styles
}
3.don不禁用视图封装。为这种特殊情况定义一个全局规则。
将以下内容放入styles.scss
.shrinking-mat-form-field {
.mat-form-field-infix {
width: auto !important;
}
}
并将.shrinking-mat-form-field
class应用到相应的元素
<mat-form-field style="width: 100%" class="shrinking-mat-form-field">
<input matInput placeholder="placeholder" />
<mat-hint align="end">hint text</mat-hint>
</mat-form-field>
尽管第二种和第三种方法基本相同,但我个人更喜欢第三种方法,因为它可读性强,在整个项目中保持一致,副作用最小,并且可以从一个点进行管理。