我正在使用Angular 6开发表单,并使用一些标准的组件,包括ng-select(我认为这是必要条件)。表单应该具有相当复杂的逻辑(某些字段值会影响ng-select应该显示的其他值或建议)。我有一个比较笼统的问题(希望有一种我尚未找到的方法),但为了更具体一点,让我们考虑以下示例:
我必须让用户从每个词典中选择一个类别和一个项目,因为我有两个字段,例如
<ng-select
name="category"
[items]="formSuggestions.categories$ | async"
bindLabel="name"
[(ngModel)]="formFields.category"
></ng-select>
<ng-select
name="item"
[items]="formSuggestions.items$ | async"
bindLabel="name"
[(ngModel)]="formFields.item"
></ng-select>
(实际上,它们被包装在自定义组件中,为简单起见,我省略了它们)
(此处formSuggestions.items$
和formSuggestions.categories$
是可观察到的,充满了有关服务器响应的建议;每个项目实际上是一个具有id
,name
和{ {1}})
我的问题是:Angular中是否有一种方法可以“订阅”模型中某个属性的更改(parentId
)并将其应用于其他属性(formFields.item
,formFields.category
)或解决此问题的唯一方法是将每个字段的输出设置为formSuggestions.categories$
?
该方法的问题在于实际形式更加复杂,例如:
所以我真的很想知道我是否可以减少模板驱动。有任何建议,至少对于2种选择情况?
答案 0 :(得分:1)
(change)
正在侦听经典输入更改事件(不是特定于Angular)。另请参见MDN-Link
对于所有[(ngModel)]
绑定的元素,您还可以使用(ngModelChange)
来监听更改。多数民众赞成在更多的角度样式。当您使用ControlValueAccessor创建自己的“输入”组件时,它会变得更加有趣。
您的示例中的问题是,您直接使用已订阅的意见类别。您可以(理论上)在可观察的流中进行“映射”,并过滤掉不需要的值。但这仅适用于可观察到的每个发射事件。
因此,在您的情况下,我担心您必须订阅源,并将结果存储在组件局部变量中。您还将数据复制到用于在UI上显示值的第二个变量中。
每当用户选择类别时,您都将获取原始存储的数据,对其进行过滤,然后将过滤后的结果分配给第二个变量。
HTML
<ng-select
name="category"
[items]="formSuggestions.categories$ | async"
bindLabel="name"
[(ngModel)]="formFields.category"
(ngModelChange)="filterCategorySugestions($selectedValue)"
></ng-select>
然后在Typescript中,您将使用filterCategorySugestions
方法来过滤数据并将其写入您的第二个变量(如上所述)。
顺便说一句,在过滤时,您可以随后应用mylist.splice(10)
(标准Array方法)将结果限制为前10个。但是也许您应该确保先确定顺序。 :-)
我希望能有所帮助。
热烈的问候 扬