是否可以通过修改后的指令覆盖默认的角度指令

时间:2018-06-26 19:52:45

标签: angular typescript angular-reactive-forms

Angular中有一个名为SelectMultipleControlValueAccessor的指令,该指令应该跟踪页面上<option>元素中选定的<select multiple>元素。在第76行,有一个用于(change)事件的主机绑定,该事件绑定为触发onChange例程。但是,就我而言,我不想跟踪选择,而是整个列表。该指令使用[formControl]选择器,因此我的第一个想法(自然地)是将其从元素中删除,但是这样做时,我发现该元素与FormGroup验证完全分离(自然地)。

我确实希望它成为FormGroup的一部分,并根据设置验证和其他FormGroup活动获得状态,所以我尝试:

  1. SelectMultipleControlValueAccessor创建一个派生指令,但是Angular似乎不喜欢它,因为它会响应并显示错误:'错误:多个内置的值访问器匹配具有未指定名称的表单控件
  2. 也许我可以删除@Directive并仅将提供程序应用于使用<select multiple>的组件? { provide: SelectMultipleControlValueAccessor, useClass: myClass, multi: true },但这没有任何效果,因为原始指令仍然适用。

在这种情况下,如何覆盖默认的指令行为?

1 个答案:

答案 0 :(得分:0)

该控件必须是install podfile的一部分,并且必须在FormGroup祖先的某个地方引用FormGroup。必须从HTML元素中删除<select multiple>[formControl]属性。这将导致指令被完全删除,并且其中一个指令将应用CSS类。这将使您定义切换和应用Angular css类的逻辑,也就是说,如果您已为这些类名称定义了任何样式。这可以在您的代码中轻松完成,并且formControlName绑定可以应用这些类。

该控件仍与[class]关联,并将参与所有活动,包括任何已定义的验证。您可以在控件上使用FormGroup来更改其值,显然您将负责保持有效值。就我而言,我有一个对象数组和一堆通过循环生成的setValue元素。我还有一个option绑定到我的数据对象,因此,如果这样做,还可以通过查询已选择的数据对象的控制值来跟踪选择。