0

ページの読み込み時に製品を読み込むGWTアプリケーションがあります。製品オブジェクト(およびそのサブオブジェクト)でPropertyChangeEventを使用して、変更が発生するたびにフィールドの値を更新しています。

もちろん、製品が初めてロードされたときにこのPropertyChangeEventが発生することは望ましくありません。このため、raisePropertyChange値をfalseに設定していますが、機能していないようです。コードベースの下にあります:

// Class ProductBaseImpl
public abstract class PropChangeImpl {

    // The raise property change event, should be turned off conditionally
    private boolean raisePropertyChangeEvent = true;

    protected boolean getRaisePropertyChangeEvent() {
        return this.raisePropertyChangeEvent;
    }

    protected void setRaisePropertyChangeEvent(final boolean value) {
        this.raisePropertyChangeEvent = value;
    }

    protected void raisePropertyChangeEvent(String fieldName, Object oldValue, Object newValue) {
        if (this.raisePropertyChangeEvent ) {
            // --> HERE IS THE PROBLEM <--
            // This IF loop must not be true when loading the product first time
            System.out.println("Property change event raised!");
            // the update operations go here
        } else {
            System.out.println("Property change event not raised!");
        }
    }
}

// Class ProductBaseImpl
public abstract class ProductBaseImpl extends PropChangeImpl {

    private static HandlerRegistration productChangeBeginRegistration;
    private static HandlerRegistration productChangeEndRegistration;

    protected E instance;

    protected ProductBaseImpl(final E instance) {
        this.instance = instance;

        // Stop updates when a new product loads
        if (ProductBaseImpl.productChangeBeginRegistration == null) {
            ProductBaseImpl.productChangeBeginRegistration = Core.getEventBus().addHandler(ProductChangeBeginEvent.TYPE, new  ProductChangeBeginEventEventHandler() {
                @Override
                public void onProductChangeBegin(final ProductChangeBeginEvent event) {
                    ProductBaseImpl.this.raisePropertyChangeEvent(false);
                }
            });
        }

        if (ProductBaseImpl.productChangeEndRegistration == null) {
            ProductBaseImpl.productChangeEndRegistration = Core.getEventBus().addHandler(ProductChangeEndEvent.TYPE, new ProductChangeEndEventtHandler() {
                @Override
                public void onProductChangeEnd(final ProductChangeEndEvent event) {
                    ProductBaseImpl.this.raisePropertyChangeEvent(true);
                }
            });
        }
    }
}

// Class ProductSubObj1
public class ProductSubObj1 extends ProductBaseImpl {
    public ProductSubObj1 (final E instance) {
        super(instance);
        // some other operations
    }
}

// similar to above, I have classes ProductSubObj1, ProductSubObj2  ...


// Class ProductProvider, that fetches the product from service to UI
public class ProductProvider {

    // some properties and members

    public void fetchProduct(String productId) {

        // Let listeners know the product is about to change
        Core.getEventBus().fireEvent(new ProductChangeBeginEvent(productId));

        // Call the service to get the product in Json data

        // After processing the data to be available for the UI  (and scheduleDeferred)
        Core.getEventBus().fireEvent(new ProductChangeEndEvent(productId));
    }
}

コードにインラインでコメントされているように、コントロールは常に

if (this.raiseDataChangeEvent) 

製品が初めてロードされたときに発生したくないブロック。

私が間違っていることを教えてください。

ありがとう。

4

1 に答える 1

0

あなたはこれをすることができますか?

protected void raisePropertyChangeEvent(String fieldName, Object oldValue, Object newValue) {
        if (this.raisePropertyChangeEvent && oldValue != null /*Or whatever your default unloaded value is*/) {
            // --> HERE IS THE PROBLEM <--
            // This IF loop must not be true when loading the product first time
            System.out.println("Property change event raised!");
            // the update operations go here
        } else {
            System.out.println("Property change event not raised!");
        }
    }
于 2012-04-05T18:52:13.450 に答える