GWT-每个事件循环只运行一次命令 我在ZURB基金会上写了一些包装类。 在将元素添加到DOM后,基础部件需要一个()/函数。
我可以用这种方法很容易地做到这一点:GWT-每个事件循环只运行一次命令 我在ZURB基金会上写了一些包装类。 在将元素添加到DOM后,基础部件需要一个()/函数。,gwt,Gwt,我可以用这种方法很容易地做到这一点: public static void initWidgets() { Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { foundationInit(); } }); } > 基础()/是对基金会 In()/函数的J
public static void initWidgets() {
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
@Override
public void execute() {
foundationInit();
}
});
}
<> > <代码>基础()/<代码>是对基金会<代码> In()/<代码>函数的JSNI调用。然后,在任何基础元素的构造函数中添加对<代码>到目前为止还不错
但是,如果在一个特定的事件循环中向DOM中添加多个基础小部件,那么将被多次调用<代码>基金会实际上并不关心这一点,但是找到一个解决问题的方法会很好。 是否有任何计划程序功能/模式允许我计划某个特定命令只运行一次,而不管该命令调用schedule方法多少次
类似于:scheduledferredifnotalreadyscheduled(命令c)
我不知道如何获取事件循环的句柄,因此我不知道如何重置指示是否添加命令的标志。我不知道任何Scheduler命令可以执行此操作,但可以使用静态布尔变量,例如:
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();
}
}
});
}
在这种情况下,我通常使用番石榴的供应商。双重检查锁定是非常安全的
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();
}
});
}
publicstaticsupplier=Suppliers.memoize(新供应商(){
@凌驾
公共布尔get(){
foundationInit();
返回true;
}
});
公共静态void initWidgets(){
Scheduler.get().ScheduledDeferred(新的Scheduler.ScheduledCommand()){
@凌驾
public void execute(){
布尔值初始化=supplier.get();
}
});
}
谢谢。但是,如果没有完整的页面刷新,则插入另一个基础元素。即,“初始化”标志将被关闭,并且不再运行。每次我在dom中插入元素时都必须运行foundationInit()。对不起,我不理解您的问题。我想我现在知道了。查看我修改的答案。抱歉,我看不到编辑。初始化将永远不会切换回false,因为代码当前处于状态。是的,我移动了Initialized=false代码>方法内部。啊,是的,这很有意义。谢谢。这是一个很好的模式,但是像@David Levesque的答案一样,它对事件循环不敏感。如果在下一个事件循环中插入基础小部件,则应该再次运行init函数。