Angular 5 - Directive ngClass and ngStyle innerHTML
我正在尝试动态更改指令样式/类。由于某些原因,当我使用ngStyle或ngClass更改innerHTML时,angular不会创建绑定。最终,我想做的是在我放置此指令的任何地方,我希望背景颜色根据服务变量进行更新。为简单起见,我创建了一个甚至不渲染我的硬编码ngStyle background-color的示例。
在示例中,我有一个简单的指令可以执行此操作,然后将其加载到应用程序组件上。我不明白为什么这条线不能使背景色变为绿色。
1
| this.element.nativeElement.innerHTML = ` BG Color should be green. But its not. `; |
这是堆叠闪电战:
https://stackblitz.com/edit/angular-xcgnmh
我想念什么?还是有更好的方法可以做到这一点?我尝试使用输出,查看了事件发射器,但它们没有帮助。
我认为您正在寻找的是@HostBinding。这里的工作示例:https://stackblitz.com/edit/angular-nzngy5?file=app/bgcolor.directive.ts。有关此主题的随机博客文章。
使用方式:
1
| @HostBinding('style.background-color') color: string = 'green'; |
更多信息:
我不相信angular知道手动innerHTML的更改。我认为您要尝试做的是创建一个自定义指令,该指令本身会自动添加并配置ngStyle指令。尽管这是可能的,但目前做起来并非易事(至少有一个未解决的问题,尽管我无法立即找到它)。一个更大的问题是,如果您既向组件中添加了独立的ngStyle指令,又向您的自定义指令添加了代码,那么我认为您的实施策略会引起问题。与正确的主机绑定解决方案相比,这也是一个巨大的矫over过正。
此外,作为一个仅供参考:在angular上,您应始终避免直接使用ElementRef。当您使用提前编译或服务器端渲染或浏览器中未执行的许多其他技术时,这可能会导致问题。 Angular还不知道这些更改(除了主机绑定之外,另一种甚至不使用ElementRef手动更新元素样式的"较低级别"方法是使用Renderer2,或者很快, renderer3。这些方法对SSR友好)。
- 谢谢您提供的信息。如果我走这条路,我将如何将其绑定到服务上。这是我正在尝试执行的操作的更新链接。我希望能够在整个应用程序中使用此指令,并在服务值更改时更改值。 stackblitz.com/edit/angular-gnqdzt?file=app / ...
-
查看您的代码,我认为您不知道的还有更多。我强烈建议您熟悉可观察的对象,因为它们会解决您的特定问题,并且您可以通过angular.io上的基础教程来学习。这是您项目的工作版本:stackblitz.com/edit/angular-jtmfav?file=app/app.component.ts
-
您的基本问题是this.color = this.testService.backgroundColor在指令初始化期间仅执行一次。如果以后this.testService.backgroundColor更新为新值,则this.color不会自动获取更新。 JavaScript无法以这种方式工作。因此,您需要可观察的东西。
-
我还应该说,"使自己熟悉可观察的事物",我的意思是说要仔细阅读angular.io上的教程。关于可观察性,有很多东西要学习,而且可能会让人难以理解。您不需要了解太多。我仍然认为我不太了解。 Angular.io应该将您设置在正确的路径上。
-
嘿,谢谢。我知道为什么我的示例不起作用,但是我不知道解决该问题的正确方法。我知道可观察的基础知识,因为我主要将它们用于http请求,但是对于这样的实例,我并没有太多使用它们。没错,它们很复杂,但是功能非常强大。毫无疑问,我会经历更多的教程并尝试更好地理解它。您所做的这个示例确实对我有很大帮助。我非常感谢您的帮助!
-
如果您需要创建自己的可观察值来存储值(不包括诸如of()或timer()之类的值),则可以使用Subject或BehaviorSubject。 BehaviorSubject是使用起始值创建的,将始终记住其"当前值",并且订阅该值的任何对象也将立即接收到当前值。 Subject没有起始值,没有"当前值",并且订阅它的任何对象仅在发出新值时才收到一个值。