Which @angular/* package(s) are relevant/related to the feature request?
forms
Description
In signal forms you can validate items in an array using, for example:
const uniqueItems = schema<string[]>(items => {
applyEach(items, item => {
validate(item, ({value, valueOf, index}) => {
const firstValueIndex = valueOf(items).indexOf(value());
return index() === firstValueIndex ? null : { kind: 'duplicate', message: 'Items must be unique' };
});
});
});
This is already a little bit messy, but quite workable.
However if you're not validating item, but item.property, you lose access to ctx.index.
For example:
const uniqueItems = schema<Array<{ property: string, propertyValue: string }>>(items => {
applyEach(items, item => {
validate(item.property, ({valueOf}) => {
// ctx.index is not available when validating item.property
});
});
});
You could still access the index via valueOf(items).indexOf(valueOf(item)), but this does become messy somewhat quickly.
You could also validate form.items as a whole, but if you want the error message to be applied to a specific item in the array- I dont think that's possible?
Proposed solution
applyEach could provide a second argument to its schemaFn, namely index.
Alternatively, perhaps indexOf could be added to FieldContext so ctx.indexOf(item) could be used.
Alternatives considered
As said, it is possible to valueOf(items).indexOf(valueOf(item)), that solution does feel quite a bit less elegant and has a bit of a code-smell to me.
Which @angular/* package(s) are relevant/related to the feature request?
forms
Description
In signal forms you can validate items in an array using, for example:
This is already a little bit messy, but quite workable.
However if you're not validating
item, butitem.property, you lose access toctx.index.For example:
You could still access the index via
valueOf(items).indexOf(valueOf(item)), but this does become messy somewhat quickly.You could also validate
form.itemsas a whole, but if you want the error message to be applied to a specific item in the array- I dont think that's possible?Proposed solution
applyEachcould provide a second argument to itsschemaFn, namely index.Alternatively, perhaps
indexOfcould be added to FieldContext soctx.indexOf(item)could be used.Alternatives considered
As said, it is possible to
valueOf(items).indexOf(valueOf(item)), that solution does feel quite a bit less elegant and has a bit of a code-smell to me.