События Onchange не стреляют в управлении повторным XPage

StackOverflow https://stackoverflow.com/questions/19825282

Вопрос

У меня есть большая форма «форма порядка», которая отображает 99 строк, с 3 текстовыми вводами в каждой строке. Чтобы захватить изменения, я вызовет вызов функции SSJS в событии «OnChange» каждого ввода. Вызов просто отправляет идентификатор продукта, тип изменения (какой столбец) и количество. Функция SSJS затем сохраняет эти изменения в переменной Sessionscope (java.util.hashmap). Там нет обновления, связанного с изменением.

Изменения обрабатываются в массовом порядке, когда пользователь нажимает кнопку «Отправить». Это еще одна функция SSJS, которая просто записывает все изменения в базу данных DOMINO.

Это, кажется, работает нормально и делало уже пару лет. Тем не менее, кажется, что мои пользователи становятся слишком эффективными с приложением и печатают быстрее, чем они могут не отставать.

Мой код отладки записывает каждое изменение в консоли сервера, и я вижу, где некоторые изменения просто игнорируются, если пользователь вносит изменения в быстрой последовательности (они просто вкладывают между полями ввода). Это почти как если бы сервер слишком занят обработкой предыдущего изменения и пропускает одно, чтобы перейти к другому. Время от времени пропускается целые блоки изменений, а затем приложение поднимается, когда оно может.

Я использую неправильную технику, чтобы захватить изменения? Есть ли что -то, что я могу сделать, чтобы приложение инициировало событие OnChange каждый раз?

Я проверил это с помощью IE8/9 & FF24. Я посмотрел на другие подобные посты, которые предлагают вместо этого использовать событие «OnKeyUp». Я не думаю, что это сработает в моем случае, поскольку пользователи могут заказать двухзначные величины.

Любые/все предложения будут с благодарностью!

Это было полезно?

Решение

Терри, тебе нужно вернуться к архитектуре. Если обновления обрабатываются при отправке, зачем отправлять их индивидуально на сервер - как заметил Тим. Что я бы сделал:

  • Создать 2 класса Java: один "заказ" один "lineitem"
  • Пусть класс заказа реализует карту интерфейса карты
  • Используйте класс заказа для управления повторением (он даст вам ключ каждой линейки в качестве переменной повторного
  • Свяжите поля внутри повторения с заказом [RepeatKey] .FieldName
  • Используйте заказ в источнике данных объекта
  • Реализуйте метод сохранения в классе заказа и вызовите его в методе сохранения источника данных объекта

Очень наброски, дайте мне знать, если вам нужно, чтобы я уточнил. Структура коллекций Java - ваш друг.

Это проще, чем выглядит:

   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 с атрибуция
Не связан с StackOverflow
scroll top