2014-02-15 2 views
0

Я пишу несколько классов-оболочек вокруг основания zurb. Фундаментальные виджеты нуждаются в функции init(), которая будет вызвана после добавления элементов в DOM.GWT - запускать команду ровно один раз за цикл событий

я могу сделать это достаточно легко с помощью этого метода:

public static void initWidgets() { 
    Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { 
     @Override 
     public void execute() { 
      foundationInit(); 
     } 
    }); 
} 

... где foundationInit() призыв JSNI к фундаментной init() функции. Затем я добавляю вызов в initWidgets() в конструктор любого элемента фундамента. Все идет нормально.

Однако, если в DOM в течение определенного цикла событий добавлено несколько виджетов элементов, то метод init() будет вызываться несколько раз. Фонд на самом деле не заботится об этом, но было бы неплохо найти способ обойти это.

Есть ли какой-либо планировщик/шаблон, который позволил бы мне запланировать определенную команду для запуска только один раз, независимо от того, сколько раз метод расписания вызывается с помощью этой команды?

Что-то вроде: scheduleDeferredIfNotAlreadyScheduled(Command c)

Я не знаю, как получить ручку на цикл событий, так что я не знаю, как сбросить флаг, который бы сказать мне или нет, чтобы добавить команду или нет.

ответ

1

Я не знаю ни одной команды Scheduller, чтобы сделать это, но это может быть сделано с помощью статической логической переменной, например:

private static boolean initialized; 

public static void initWidgets() { 
    initialized = false; 

    Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { 
     @Override 
     public void execute() { 
      if (!initialized) { 
       initialized = true; 
       foundationInit(); 
      } 
     } 
    }); 
} 
+0

Спасибо. Однако это не работает, если вставлен другой элемент фундамента без полного обновления страницы. То есть «инициализированный» флаг будет отключен и больше не будет запущен. foundationInit() должен запускаться каждый раз, когда я вставляю элементы в dom. – user717847

+0

Извините, я не понял ваш вопрос. Думаю, теперь я это делаю. См. Мой измененный ответ. –

+0

Извините, я не вижу редактирования. Инициализированный никогда не будет переключен обратно на false, поскольку код в настоящее время стоит. – user717847

0

В таком случае я обычно использую Supplier.double гуавы проверено замок действительно безопасно.

public static Supplier<Boolean> supplier=Suppliers.memoize(new Supplier<Boolean>() { 
    @Override 
    public Boolean get() { 
     foundationInit(); 
     return true; 
    } 
}); 

public static void initWidgets() { 
    Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { 
     @Override 
     public void execute() { 
      boolean initialized=supplier.get(); 
     } 
    }); 
} 
+0

Это хороший образец, однако, как ответ @David Levesque, он не чувствителен к циклу событий. Если во время следующего цикла события вставлен виджет фонда, функция init должна снова запускаться. – user717847

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