[英]onChange events not firing in an XPage repeat control
我有一個大型的“訂單表單” XPage,它顯示99行,每行帶有3個文本輸入框。 為了捕獲更改,我在每個輸入框的“ onchange”事件中調用了SSJS函數。 該呼叫僅發送產品ID,變更類型(哪一列)和數量。 然后,SSJS函數將這些更改保留在sessionScope變量(java.util.HashMap)中。 沒有與更改相關的刷新。
當用戶單擊“提交”按鈕時,將對更改進行整體處理。 那是另一個SSJS函數,它僅將所有更改寫入后端Domino數據庫。
看起來一切正常,並且已經完成了幾年。 但是,看來我的用戶使用該應用程序的效率越來越高,並且鍵入速度快於其跟上的速度。
我的調試代碼將每個更改寫入服務器的控制台,並且可以看到如果用戶快速連續進行更改(在輸入框之間使用選項卡),則某些更改將被忽略。 幾乎就像服務器在忙於處理上一個更改並跳過一個更改而轉移到另一個更改一樣。 有時,所有更改塊都將丟失,然后應用程序將在可能的情況下進行恢復。
我使用錯誤的技術來捕獲更改嗎? 我可以做些什么來確保應用程序每次都啟動onchange事件嗎?
我已經使用IE8 / 9和FF24對此進行了測試。 我看過其他建議使用“ onkeyup”事件的帖子。 我認為這不適用於我的情況,因為用戶可能訂購兩位數的數量。
任何/所有建議將不勝感激!
特里,您需要重新審視架構。 如果更新是在提交時處理的,為什么還要麻煩將它們分別發送到服務器-正如Tim所指出的那樣。 我會做什么:
非常粗略的輪廓,如果您需要我詳細說明,請告訴我。 Java Collections Framework是您的朋友。
它比看起來容易:
public class LineItem {
private String unid;
private String partno;
private int quantity;
private long unitprice;
/**
* Constructor for new items
*/
public LineItem() {
this.unid = null;
}
/**
* Constructor for existing items
*/
public LineItem(Document doc) {
this.unid = doc.getUniversalId();
// more here
}
/**
* @return the unid
*/
public String getUnid() {
return this.unid;
}
/**
* @return the partno
*/
public String getPartno() {
return this.partno;
}
/**
* @param partno the partno to set
*/
public void setPartno(String partno) {
this.partno = partno;
}
/**
* @return the quantity
*/
public int getQuantity() {
return this.quantity;
}
/**
* @param quantity the quantity to set
*/
public void setQuantity(int quantity) {
this.quantity = quantity;
}
/**
* @return the unitprice
*/
public long getUnitprice() {
return this.unitprice;
}
/**
* @param unitprice the unitprice to set
*/
public void setUnitprice(long unitprice) {
this.unitprice = unitprice;
}
public void save(Database db) {
Document doc = null;
if (this.unid == null) {
doc = db.createDocument();
doc.replaceItem("Form", "LineItem");
}
doc.replaceItem("PartNo", this.partno);
// More here
doc.save();
}
}
對於訂單-假設您從文檔集合中加載。
public class Order implements Map<String, LineItem> {
// You might want to have a stack here to keep order
private final Map<String, LineItem> backingMap = new LinkedHashMap<String, LineItem>();
private final Set<String> deletedItemKeys = new HashSet<String>();
// The key we use for new items when unid is null
private int lastNewItemNumber = 0;
@Override
public int size() {
return this.backingMap.size();
}
@Override
public boolean isEmpty() {
return this.backingMap.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return this.backingMap.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return this.backingMap.containsValue(value);
}
@Override
public LineItem get(Object key) {
return this.backingMap.get(key);
}
@Override
public LineItem put(String key, LineItem value) {
// Here it gets a little special
// We need to prevent null keys
if (key == null) {
key = String.valueOf(this.lastNewItemNumber);
lastNewItemNumber++;
}
this.deletedItemKeys.remove(key);
return this.backingMap.put(key, value);
}
@Override
public LineItem remove(Object key) {
this.deletedItemKeys.add(key.toString());
return this.backingMap.remove(key);
}
@Override
public void putAll(Map<? extends String, ? extends LineItem> m) {
for (Map.Entry<? extends String, ? extends LineItem> me : m.entrySet()) {
this.put(me.getKey(), me.getValue());
}
}
@Override
public void clear() {
this.deletedItemKeys.addAll(this.backingMap.keySet());
this.backingMap.clear();
}
@Override
public Set<String> keySet() {
return this.backingMap.keySet();
}
@Override
public Collection<LineItem> values() {
return this.backingMap.values();
}
@Override
public Set<java.util.Map.Entry<String, LineItem>> entrySet() {
return this.backingMap.entrySet();
}
public void load(NotesDocumentCollection dc) throws NotesException {
Document doc = dc.getFirstDocument();
Document nextDoc;
while (doc != null) {
nextDoc = dc.getNextDocument(doc);
LineItem li = new LineItem(doc);
this.put(doc.getUniversalId(), li);
doc.recycle();
doc = nextDoc;
}
doc.recyle();
}
public void save(Database db) {
for (LineItem item : this.backingMap.values()) {
item.save(db);
}
// Now kill the left overs - needs error handling
for (String morituri : this.deletedItemKeys) {
Document delDoc = db.getDocumentByUnid(morituri);
if (delDoc != null) {
delDoc.remove(true);
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.