3

私はかなり長い間 ClientBundle と CssResources を使用してきましたが、スタイルが何度も挿入されていることに気付きました。私が指摘できることの1つは、かなりの数を使用していることです<ui:with field='resources' type='com.vf.client.resources.Resources' />私のテンプレートでは、これが私の clientBundle の複数のコピーを作成しているのではないかと疑っています。これを引き起こす可能性があることの 1 つは、ビューを clientfactory にキャッシュする Ray Ryan の概念を使用しているため、一部のビューが DOM にアタッチされる前に作成されることです。私の基本ビューでは、UiBinder が新しいリソースを生成しないように、リソースに provided=true を使用しています。ただし、これは機能しない可能性があります。私は疑っていますが、ui:with は新しいコピーを作成し、提供された = true を無視しています。Chrome と Firebug の開発者ツールを使用して確認しましたが、どちらの場合もスタイルが何度も挿入されています。すべての UiBinder テンプレートから Resources クラスを削除せずにこの問題を解決する方法さえわからないため、かなりの作業が必要になります。どんなアイデアでも大歓迎です。

/**
 * 
 * @author chris
 */
public abstract class ViewImpl extends Composite implements IView, RequiresResize {

    @UiField(provided = true)
    public final Resources resources;

}




public interface Resources extends ClientBundle, CellTable.Resources, CellList.Resources, DataGrid.Resources {

    /**
     * These are the obfuscated styles.
     * 
     * @return
     */
    @Source({ "default.css", "default-external.css"})
    public Style style();
}

アップデート

ファクトリー/シングルトンを使用して、1つだけを作成するようにしています。アプリケーションの起動時に、ClientFactory 実装でこの Resources ClientBundle を作成します。アプリケーションの開始時に、スタイルで ensureEnjected を呼び出します。それ以降、コードで ensureInjected が呼び出されることはありません。

これは、singleon リクエスト ファクトリを取得するだけのファクトリです。以前はインターフェイス内に静的イニシャライザを使用していましたが、複数のスタイルの問題を解決するためにしばらく前にこれに移行しました。

import com.google.gwt.core.client.GWT;

public class ResourcesFactory {

    private static Resources instance = null;

    private ResourcesFactory() {
    }

    public static final Resources getResources() {
        if (instance == null) {
            instance = GWT.create(Resources.class);
        }

        return instance;
    }
}

私のクライアント バンドルは、ここでのみ初期化され、挿入されます。

  @Override
    public void onModuleLoad() {
        if (Window.Location.getParameterMap().containsKey("debug")) {
            Window.alert("Remote Debugging will be enabled, see server log for debug information");
            RemoteDebugService.enable();    
        }

        try {
            clientFactory = ClientFactory.INSTANCE;
            masterLayoutPanel = clientFactory.getMasterLayoutPanel();
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Unable to instantiate the ClientFactory", e);
            Window.alert("SOMEBODY BROKE THE BUILD, add ?debug to the url to enable remote debugging" + e.getMessage());
        }

        RootLayoutPanel.get().add(masterLayoutPanel);
        StyleInjector.inject(clientFactory.getResources().style().getText());

        PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(clientFactory.getPlaceHistoryMapper());
        PlaceController placeController = clientFactory.getPlaceController();

        // Start PlaceHistoryHandler with our PlaceHistoryMapper
        historyHandler.register(placeController, clientFactory.getEventBus(), defaultPlace);

        startApplication(clientFactory, historyHandler);
        }
4

2 に答える 2

0

複数回注射したとはどういう意味ですか?

ClientBundle は基本的にシングルトンです (このスレッドを参照してください。複数の UiBinders から単一の ClientBundle クラスを参照すると、何かコストがかかりますか? )。
したがって、使用するかどうかは問題ではありませprovided=trueん。

しかし、本当に ClientBundle プロキシを回避したい場合は、Ginまたはを使用しFactoryて (GWT.createまたは魔法のように を介して @Inject)ClientBundle一度インスタンス化して、それをあなたに注入することができますViewsが、コンパイルされたコードでは大きな違いはないと思います。

于 2013-04-19T09:09:35.923 に答える