通过 angular-cli 的 AOT 编译错误,与 HTML 属性 data-on-color 冲突
AOT compile error via angular-cli, conflict with HTML attribute data-on-color
我 运行 这个 cmd ng build --prod
,但是我得到了这个错误 Property 'brand' does not exist on type
。
不知道为什么 data-on-color="brand" HTML 属性与此相关。
我试图将所有 data-on-color="brand"
重命名为其他名称。例如。 data-lon-color="brand"
然后 AOT 编译工作。
下面是文件 /theme/angular/default/src/app/theme/pages/components/base/base-bootstrap-notify/base-bootstrap-notify.component.html
的内容,如错误中所述。
<div class="form-group m-form__group row">
<label class="col-form-label col-lg-3 col-sm-12">
URL Clickable
</label>
<div class="col-lg-4 col-md-9 col-sm-12">
<input data-switch="true" type="checkbox" data-on-color="brand" id="m_notify_url">
</div>
</div>
<div class="form-group m-form__group row">
<label class="col-form-label col-lg-3 col-sm-12">
Allow dismiss
</label>
<div class="col-lg-4 col-md-9 col-sm-12">
<input data-switch="true" type="checkbox" checked data-on-color="brand" id="m_notify_dismiss">
</div>
</div>
<div class="form-group m-form__group row">
<label class="col-form-label col-lg-3 col-sm-12">
Pause on hover
</label>
<div class="col-lg-4 col-md-9 col-sm-12">
<input data-switch="true" type="checkbox" data-on-color="brand" id="m_notify_pause">
</div>
</div>
下面是.ts文件BaseBootstrapNotifyComponent
import {Component, OnInit, ViewEncapsulation} from '@angular/core';
import {ScriptLoaderService} from '../../../../../_services/script-loader.service';
@Component({
selector: "app-base-bootstrap-notify",
templateUrl: "./base-bootstrap-notify.component.html",
styleUrls: ["./base-bootstrap-notify.component.scss"],
encapsulation: ViewEncapsulation.None,
})
export class BaseBootstrapNotifyComponent implements OnInit {
constructor(private _script: ScriptLoaderService) {
}
ngOnInit() {
}
ngAfterViewInit() {
this._script.load('app-base-bootstrap-notify',
'assets/demo/default/custom/components/base/bootstrap-notify.js');
}
}
Angular normalizes 解析模板时的属性名
private _normalizeAttributeName(attrName: string): string {
return /^data-/i.test(attrName) ? attrName.substring(5) : attrName;
}
所以你的字符串变成了
<input on-color="brand">
注意:甚至<div data-*ngIf="3">Hello</div>
也可以正常工作。
那么angular有两个选项可以声明事件
1) (event)
2) on-event
因此 angular 认为您使用 color
名称声明了输出事件
<input (color)="brand">
对于 aot,您必须在组件中声明处理程序 brand
。
解决方法
<input [attr.data-on-color]="'brand'">
我 运行 这个 cmd ng build --prod
,但是我得到了这个错误 Property 'brand' does not exist on type
。
不知道为什么 data-on-color="brand" HTML 属性与此相关。
我试图将所有 data-on-color="brand"
重命名为其他名称。例如。 data-lon-color="brand"
然后 AOT 编译工作。
下面是文件 /theme/angular/default/src/app/theme/pages/components/base/base-bootstrap-notify/base-bootstrap-notify.component.html
的内容,如错误中所述。
<div class="form-group m-form__group row">
<label class="col-form-label col-lg-3 col-sm-12">
URL Clickable
</label>
<div class="col-lg-4 col-md-9 col-sm-12">
<input data-switch="true" type="checkbox" data-on-color="brand" id="m_notify_url">
</div>
</div>
<div class="form-group m-form__group row">
<label class="col-form-label col-lg-3 col-sm-12">
Allow dismiss
</label>
<div class="col-lg-4 col-md-9 col-sm-12">
<input data-switch="true" type="checkbox" checked data-on-color="brand" id="m_notify_dismiss">
</div>
</div>
<div class="form-group m-form__group row">
<label class="col-form-label col-lg-3 col-sm-12">
Pause on hover
</label>
<div class="col-lg-4 col-md-9 col-sm-12">
<input data-switch="true" type="checkbox" data-on-color="brand" id="m_notify_pause">
</div>
</div>
下面是.ts文件BaseBootstrapNotifyComponent
import {Component, OnInit, ViewEncapsulation} from '@angular/core';
import {ScriptLoaderService} from '../../../../../_services/script-loader.service';
@Component({
selector: "app-base-bootstrap-notify",
templateUrl: "./base-bootstrap-notify.component.html",
styleUrls: ["./base-bootstrap-notify.component.scss"],
encapsulation: ViewEncapsulation.None,
})
export class BaseBootstrapNotifyComponent implements OnInit {
constructor(private _script: ScriptLoaderService) {
}
ngOnInit() {
}
ngAfterViewInit() {
this._script.load('app-base-bootstrap-notify',
'assets/demo/default/custom/components/base/bootstrap-notify.js');
}
}
Angular normalizes 解析模板时的属性名
private _normalizeAttributeName(attrName: string): string {
return /^data-/i.test(attrName) ? attrName.substring(5) : attrName;
}
所以你的字符串变成了
<input on-color="brand">
注意:甚至<div data-*ngIf="3">Hello</div>
也可以正常工作。
那么angular有两个选项可以声明事件
1) (event)
2) on-event
因此 angular 认为您使用 color
名称声明了输出事件
<input (color)="brand">
对于 aot,您必须在组件中声明处理程序 brand
。
解决方法
<input [attr.data-on-color]="'brand'">