Chciałbym zacząć od x nie. pól (w mojej aplikacji mam parę tekstowego pola danych i pole danych numerycznych) na aplikacji xpage (powiedzmy 10 par), a następnie, gdy użytkownik kliknie "więcej pól", chcę, aby więcej par pojawiało się dynamicznie bez pełnego odśwież na stronie, ale chciałbyś mieć nieograniczoną liczbę nie. pól (o ile strona się nie zawiesza), a następnie chciałbym przesłać formularz i dane dla wszystkich tych pól. Jaki jest najlepszy sposób na wdrożenie tego?Xpages więcej pól (bez ograniczeń) za jednym kliknięciem przycisku
Odpowiedz
Zazwyczaj pola są związane ze źródłem danych dokument za pomocą kropki notacji:
<inputText value="#{contact.firstName}" />
Jednak notacja tablica rozwiązywane są także:
<inputText value="#{contact['firstName']}" />
Ponieważ nazwa pola w tym ostatnim składni jest bycie traktowany jak łańcuch, a nie jako niejawna własność komponentu bean, może być obliczany dynamicznie. Najłatwiejszym sposobem zdefiniowania tych dynamicznych pól jest utworzenie niestandardowego elementu sterującego dla każdego z podstawowych typów pól i zdefiniowanie każdego z nich jako akceptującego źródło danych i nazwę pola. Tak samo pole po czym kończy się o składni podobnej do następującej:
<inputText value="#{compositeData.dataSource[compositeData.fieldName]}" />
Używając tej składni, obliczenie dowolnej złożoności mogą być używane do określenia, jakie pole Nazwa przekazać do kontroli niestandardowej. W scenariuszu próbujesz osiągnąć, określając indexVar sprawie kontroli powtórzyć, że otacza para pól pozwoli Ci wyznaczyć przyrostek pola dla każdego ... może coś jak następuje:
<xp:repeat indexVar="fieldSuffix" value="#{viewScope.rowCount}">
<xp:div>
<xc:dynamicInputText dataSource="#{contact}" fieldName="fullName_#{fieldSuffix}" />
<xc:dynamicInputNumber dataSource="#{contact}" fieldName="phoneNumber_#{fieldSuffix}" />
</xp:div>
</xp:repeat>
Z tego podejście, skończyłbyś z polami o nazwach "fullName_0", "fullName_1" itd., aż do limitu określonego w viewScope. Zazwyczaj jedyną komplikacją jest zapewnienie, że po otwarciu istniejącego dokumentu zmienna viewScope zostanie przywrócona do poprawnego limitu. Innym podejściem do tego jest oczywiście zapisanie limitu jako kolejnego elementu w dokumencie i powiązanie z nim wartości powtórzeń.
Możesz również rzucić okiem na ćwiczenie 23 "Stołówka". Nie wykonuje wielu pól, ale zawiera pola o wielu wartościach, które mogą być lepsze pod względem przetwarzania i przechowywania (możesz wykonać @Elements, aby dowiedzieć się, ile jest w dokumencie). Ćwiczenie jest tutaj: http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Tutorial-Introduction-to-XPages-Exercise-23 Podczas gdy przycisk dodaje tylko jeden wiersz na raz, można go łatwo dopasować.
Dziękuję, dam to przejść – pipalia
Co można zrobić, to mieć fasolę z 2 wartościami String Label i Data oraz zarządzany komponent bean, który ma ArrayList tego obiektu, więc wewnątrz kontroli powtórzeń wiążesz powtórzenie z ArrayList, a następnie powiąż swój xp: inputText do rowData.Data i twoja xp: etykieta do rowData.Label wtedy gdy chcesz dodać kolejne 5 wierszy po prostu dodajesz jeszcze wiele obiektów do ArrayList, a następnie odświeżasz swoją stronę, twoje dane będą nadal żyły w twojej liście i będziesz miał 5 nowe puste obiekty, w których można dodawać dane.
public class Data {
private String label;
private String data;
public Data() {
}
//getters and setters
}
public class ManagedBean {
private ArrayList<Data> datalist; // add a managed property for this one so It will create a new one when needed.
// getters and setters
public addFiveMoreObjects() {
Data newItem;
for (int i=0; i<5; i++) {
newItem = new Data();
datalist.add(newItem);
}
}
}
<xp:repeat value="#{managedBean.datalist}" var="rowData">
<xp:text value="#{rowData.label}" />
<xp:inputText value="#{rowData.data} />
</xp:repeat>
<xp:button value="Add 5 More"> // call #{managedBean.addFiveMoreObjects}
To wygląda naprawdę interesujące i wielkie dzięki za udostępnianie. Ponieważ nie uruchomiłem jeszcze Javabeans dev, mogę najpierw wypróbować inne metody. – pipalia
Dziękuję Tim, na pewno sprawię, że odejdę i będę na bieżąco. Nie próbowałem tego, ale zastanawiam się, czy wykonuję częściowe odświeżenie kontrolki powtarzania, nie stracę istniejących danych? – pipalia
Miałem zamiar odpowiedzieć na to dokładnie tymi samymi liniami, ta metoda zadziała, polecam obliczenie "limitu powtórzeń" na taki sam poziom jak limit viewScope, więc nie zastanawiasz się, dlaczego nie pojawiają się nowe pola po trafieniu 30. –
Świetna propozycja, Declan.Możesz oczywiście dołączyć pager do powtórzenia, ale dla tego typu interfejsu większość użytkowników nie oczekiwałaby, że paginacja będzie dostępna w taki sposób, jak w przypadku interfejsów typu view, tak więc wymuszanie atrybutu "rows" zawsze jest zgodne z limitem prawdopodobnie lepiej. –