Mam komponent, w którym tworzę lightning:recordEditForm
przy użyciu pól opartych na innych zestawach pól, które wyglądają jak coś takiego:
<aura:component> <aura:attribute name="fieldApiNames" type="List" /> <aura:attribute name="showSpinner" type="Boolean" default="true" /> <aura:if isTrue="{!v.showSpinner}"> <lightning:spinner alternativeText="Loading..." /> </aura:if> <lightning:recordEditForm onload="{!c.handleLoad}" objectApiName="Account"> <lightning:messages /> <lightning:layout multipleRows="true"> <aura:iteration items="{!v.fieldApiNames}" var="api"> <lightning:layoutItem aura:id="formItems" size="6"> <div aura:id="top-div" /> <lightning:inputField aura:id="field" fieldName="{!api}" /> <div aura:id="bottom-div" /> </lightning:layoutItem> </aura:iteration> </lightning:layout> </lightning:recordEditForm> <lightning:button title="Show Field Values" onclick="{!c.handleButton}" /> </aura:component>
Gdy dzwonisz pod numer find()
na aura:id
, które występuje wiele razy, otrzymasz tablicę wszystkiego z tym aura:id
. Gdybym chciał uzyskać dostęp do elementu w treści jednego z elementów zwróconych przez moje wywołanie find()
, czy mógłbym to zrobić za pomocą aura:id
wspomnianego elementu podrzędnego, jak poniżej, w funkcji handleButton
?
({ handleLoad : function(cmp, evt, helper) { cmp.set( "v.showSpinner", false ); }, handleButton : function(cmp, evt, helper) { var first = cmp.get("v.fieldApiNames")[0]; cmp.find("formItems").forEach( function(item) { alert( item.find("field").get("v.value") ); <== ? } ); } })
Komentarze
Odpowiedź
Wygląda na to, że to „zagnieżdżone znalezienie” (samo w sobie) nie jest możliwe. Zdecydowałem się na dynamiczne utworzenie każdego elementu lightning:layoutItem
i odpowiednio każdego zagnieżdżonego lightning:inputField
w init
program obsługi dla mojego komponentu. Pozwoliło mi to przypisać aura:id
podczas tworzenia poszczególnych komponentów.
Odpowiedź
powinieneś użyć foreach
dla lightning:inputField
aura id, wtedy otrzymasz tablicę cmps inputfields, a następnie wykonaj foreach i uzyskaj wartości takie jak to, co próbowałem poniżej
controller.js
handleButton : function(cmp, evt, helper) { var first = cmp.get("v.fieldApiNames")[0]; cmp.find("field").forEach( function(itemcmp) { alert( itemcmp.get("v.value") ); <== ? } ); }
Komentarze
- To zadziała w scenariuszach, w których przypadek użycia jest dokładnie taki sam jak w moim przykładzie. Niestety (i przepraszam, jeśli była to zła praktyka), mój przykład nie jest moim dokładnym przypadkiem użycia. Próbowałem to uprościć, aby znaleźć odpowiedź bez zbytniej szczegółowości.
cmp.find("formItems").find("field").get("v.value");
?cmp.find("formItems")
, ponieważ będzie wiele elementów z tymaura:id
.