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函数。