2015-07-03 4 views
0

Я пытаюсь обновить сетку в Vaadin после внесения изменений в сетку из другого экземпляра пользовательского интерфейса.Как обновить сетку Ваадина после нажатия?

Чтобы разработать, у меня есть два разных экземпляра пользовательского интерфейса, UI1 и UI2 (вкладки из двух разных браузеров). Эти экземпляры пользовательского интерфейса содержат представление, содержащее сетку, состоящую из объектов Contact, которые имеют различные свойства, такие как имя, возраст, пол ...

Я добавляю контакт в сетку из UI1, и я хочу, чтобы UI2 увидел обновленную сетку мгновенно, без необходимости обновления.

Для этого я знаю, что мне нужно использовать Vaadin Push, который я уже настроил с использованием класса Broadcaster. У меня есть метод receiveBroadcast() в моем классе пользовательского интерфейса, который будет обновлять пользовательский интерфейс, когда класс View отправляет широковещательную передачу в пользовательские интерфейсы с использованием метода broadcast(). Часть моего класса пользовательского интерфейса выглядит следующим образом:

@Title("Contact Book") 
@Theme("reindeer") 
@Push 
public class UserInterface extends UI implements BroadcastListener{  

    private Navigator navigator; 

    @Override 
    protected void init(VaadinRequest request){ 
     navigator = new Navigator(this, this); 
     navigator.addView(ContactBookView.NAME, new ContactBookView()); 

     Broadcaster.register(this); 
    } 
    @Override 
    public void detach(){ 
     Broadcaster.unregister(this); 
     super.detach(); 
    } 

    @Override 
    public void receiveBroadcast(Grid grid) { 
     access(()->{ 

      // update grid here 
      Notification.show("Grid updated", Notification.Type.TRAY_NOTIFICATION); 
     }); 
    } 
} 

И мой класс Broadcaster как то же самое в this link (я просто изменил методы немного, чтобы я мог пройти сетку в качестве параметра)

Тогда в мой класс ContactBookView я вызываю метод Broadcaster.broadcast(grid) после добавления или изменения элемента, так что я могу как-то обновить сетку в моем классе UI 'access(), но ничего, что я пытался, похоже, работает. Я знаю, что push работает, потому что я вижу сообщение «Grid updated» во всех экземплярах пользовательского интерфейса, когда принимается трансляция.

Я попытался удалить представление и повторно инициализировать

navigator.removeView(ContactBookView.NAME); 
navigator.addView(ContactBookView.NAME, new ContactBookView()); 

Пробовал полностью опорожнить сетки и заправить

grid.removeAllColumns(); 
grid.setContainerDataSource(container); 

Пытались заставить сетку обновить себя, используя этот уродливый обходной

grid.setContainerDataSource(grid.getContainerDataSource()); 

Пробовал выполнить запрос JavaScript, чтобы заставить пользовательские интерфейсы синхронизировать

JavaScript.getCurrent().execute("javascript:vaadin.forceSync();"); 

Но никто из них не работал. Может быть, я делаю что-то еще неправильно? FYI моя версия Vaadin - 7.5.0.

Я оценил бы любые отзывы или советы,

Спасибо.

ответ

2

мне удалось решить эту проблему путем повторного навигации к текущему виду после того, как я реинициализирована его. Окончательный метод доступа UI выглядит следующим образом:

public void receiveBroadcast() { 
    access(()->{ 

     navigator.removeView(ContactBookView.NAME); 
     navigator.addView(ContactBookView.NAME, new ContactBookView()); 
     navigator.navigateTo(ContactBookView.NAME); 
     Notification.show("Grid updated", Notification.Type.TRAY_NOTIFICATION); 
    }); 

При этом, вид получает обновляется в фоновом режиме и подтолкнул к экземплярам пользовательского интерфейса, не обновляя физически.

Я уверен, что могут быть лучшие обходные пути, и этот кажется уродливым, но в настоящее время он удовлетворяет мои потребности. Тем не менее, я по-прежнему ценю любой другой подход.

1

Если вы используете navigator.navigateTo(PortletUI.SOMEPAGE);

В somePageInstance следует назвать первым enter() методом, в то время как вы придете туда через навигатор, так что вы не можете попробовать обновление сетку там: о)

PortletUI:

public static final String SOMEPAGE = null; 
Navigator navigator; 

SomePage somePageInstance = null; 

protected void init(VaadinRequest request) { 
     InitPortlet.initPortlet(this); 

     // Create a navigator to control the views 
     navigator = new Navigator(this, this); 

     somePageInstance = new SomePage(); 

     navigator.addView(SOMEPAGE, somePageInstance); 

SomePage:

public class SomePage extends SomePageDesign implements View{ 

//or you can give there navigator from portlet through constructor probably 
Navigator navigator; 

@Override 
    public void enter(ViewChangeEvent event) { 
     //needed for navigate to another page :) 
     navigator = event.getNavigator(); 
     //Update grid 
    } 
} 

Надежда, что помогает :)

+1

Я вижу вашу точку зрения о методе «войти», но вещатель активируется нажатием кнопки, и я не использую метод «navigatoTo», пытаясь нажимать обновления между пользовательскими интерфейсами, поэтому я не могу понять, почему Мне нужно обновить сетку в методе «вводить», поскольку она вызывается только при вызове метода «navigateTo». – tk12

Смежные вопросы