我最近在新的Angular2框架上做了很多工作。在测试一些功能时,我最终得到了错误:
无法绑定到'ngStyle',因为它不是已知的本机属性
在调查错误本身时,我遇到了几个解决方案,比如将'directive:[NgStyle]'添加到组件中,但这并没有解决问题。
代码如下:
main.ts
import {bootstrap} from 'angular2/platform/browser';
import {App} from './app'
bootstrap(App).then(error => console.log(error));
app.ts
import { Component } from 'angular2/core';
import { Button } from './button';
import { NgStyle } from "angular2/common";
@Component({
selector: 'app',
template: '<h1>My First Angular 2 App</h1><button>Hello World</button>',
directives: [Button, NgStyle]
})
export class App { }
button.ts
import {Component} from "angular2/core";
import {NgStyle} from "angular2/common";
@Component({
selector: 'button',
host: {
'[ngStyle]': 'style()'
},
templateUrl: '<ng-content></ng-content>',
directives: [NgStyle]
})
export class Button {
style() {
return {
'background': 'red'
}
}
}
感谢您的帮助。
答案 0 :(得分:25)
当您不导入CommonModule
模块时会发生这种情况。在最近的Angular版本中,所有DOM级别指令都归入同一模块。
import { CommonModule } from '@angular/common';
您可以单独导入NgClass
或NgStyle
,但如果最终在通过路由器访问的多个组件中使用相同的内容,Angular很快就会抛出错误。
答案 1 :(得分:4)
如果您需要充分的灵活性,请通过主持人提供
host: {
'[class.someName]':'someValue',
'[style.someProp]':'someValue'
}
你需要使用像
这样的命令式方法@Component({ ... })
export class SomeComponent {
constructor(private renderer:Renderer, private elementRef:ElementRef) {}
someMethod() {
this.renderer.setElementClass(
this.elementRef.nativeElement, this.getClassFromSomewhere());
this.renderer.setElementStyle(
this.element.nativeElement, 'background-color', this.getColor());
}
}
或其他方法Renderer提供。
答案 2 :(得分:2)
请注意,我在撰写此问题时找到了解决方案。我想分享它,以便其他人不必寻找永恒。
请查看以下链接:
Angular2 Exception: ngClass within a Host, "isn't a known native property"
正如'GünterZöchbauer'所描述的那样,不可能在主机绑定中使用指令。他为ngClass提供了一个解决方案。
这是我的问题的简单解决方案:
<强> button.ts 强>
import {Component} from "angular2/core";
import {NgStyle} from "angular2/common";
@Component({
selector: 'button',
host: {
'[style]': 'styleAsString()'
},
templateUrl: 'app/button.html',
directives: [NgStyle]
})
export class Button {
styleAsString() {
let style = {
background: 'red'
};
return JSON.stringify(style).replace('{', '').replace('}', '').replace(/"/g, '');
}
}
请注意,这不是一个完美的解决方案,因为它在将对象“编译”为普通css时缺乏。我只是替换'''的所有出现,这在使用'url(“”),...时会导致奇怪的行为。 希望我可以帮助有相同或类似问题的人。
答案 3 :(得分:0)
如果有人使用业力进行单元测试时遇到此错误。
我在业力测试中遇到此错误。我可以通过导入 FlexLayoutModule
来解决此问题import { MaterialModule } from '@app-modules/material.module.ts';
import { FlexLayoutModule } from '@angular/flex-layout';
import { DashboardComponent } from './dashboard.component';
describe('DashboardComponent', () => {
let component: DashboardComponent;
let fixture: ComponentFixture<DashboardComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [ MaterialModule, FlexLayoutModule ],
declarations: [
DashboardComponent
]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(DashboardComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
我希望有人帮这个答案。