доступ к данным vaadin на стороне клиента - PullRequest
2 голосов
/ 19 февраля 2011

Хотелось бы узнать, есть ли способ доступа или предоставления данных, которыми управляет Vaadin на стороне клиента.Т.е. я использую некоторые данные на сервере внутри приложения Vaadin.В пользовательском интерфейсе я хотел бы включить виджет визуализации, который использует эти данные и использует Raphael.js.Я подозреваю, что это возможно при использовании графической библиотеки gwt, но это будет означать создание собственного виджета Vaadin, который выглядит как headf * ck.Нет ли более простого способа, такого же простого, как использование простого javascript на стороне клиента?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2011

Я создал виджет со следующим серверным API:

private Map<String,Object> attributes = new HashMap<String,Object>();

@Override
public void paintContent(PaintTarget target) throws PaintException {
    super.paintContent(target);

    for (String key : attributes.keySet()) {
        Object value = attributes.get(key);
        if (value instanceof Boolean)
            target.addAttribute(key, ((Boolean) value).booleanValue());
        else if (value instanceof Float)
            target.addAttribute(key, ((Float) value).floatValue());
        else if (value instanceof Double)
            target.addAttribute(key, ((Double) value).doubleValue());
        else if (value instanceof Integer)
            target.addAttribute(key, ((Integer) value).intValue());
        else if (value instanceof Long)
            target.addAttribute(key, ((Long) value).longValue());
        else if (value instanceof String)
            target.addAttribute(key, (String) value);
        else if (value instanceof Map<?,?>)
            target.addAttribute(key, (Map<?,?>) value);
        else if (value instanceof Object[])
            target.addAttribute(key, (Object[]) value);
    }

    // We could also set variables in which values can be returned
    // but declaring variables here is not required
}

public void resetAttributes() {
    attributes.clear();
}

public void setAttribute(String key, Object value) {
    attributes.put(key, value);
}

На стороне клиента я просто присоединяю полученный UIDL к документу.

public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
    this.client = client;
    paintableId = uidl.getId();
    shareVars(uidl, getElement());
}

public native void shareVars(UIDL uidl, Element element) /*-{
    var el = element;
    var ownDoc = element.ownerDocument;
    ownDoc.uidl = uidl;
    ownDoc.doGraphics();
}-*/;

Сейчасв doGraphics () я могу получить доступ к данным uidl с помощью uidl [1] ["attname"]

Комбинируя его с виджетом IcePush, я получаю все необходимое поведение, и все прекрасно работает.

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

2 голосов
/ 22 февраля 2011

Ну, вы можете просто использовать обычный JavaScript и представлять данные с сервера как простой ресурс JSON, который вы будете использовать в клиенте, используя простой запрос GET / POST к этому ресурсу.

Добавление JS в VaadinПриложения могут быть сделаны либо путем переопределения метода из AbstractApplicationServlet, либо с помощью CustomLayout, который включает JS.И, конечно, есть метод Window.executeJavaScript для небольших фрагментов кода JS.

Не способ, с помощью которого Vaadin что-то делает, но вполне выполнимый.

...