互換モードなしでVaadin14.0.13を使用する。
ビューを使用して、動的コンテンツを含むダイアログを作成します。
@Route("")
public class MainView extends VerticalLayout {
public MainView(DialogContentProvider contentProvider) {
this.add(new Button("Click me!", event -> new Dialog(contentProvider.create()).open()));
}
}
contentProvider
インターフェースです
public interface DialogContentProvider {
Component create();
}
この実装では:
public class CheckBoxContentProvider implements DialogContentProvider {
@Override
public Component create() {
return new Checkbox("My checkbox", true);
}
}
Beanを使用してSpringBoot(バージョン2.2.1.RELEASE)によってインスタンス化されます。
@Bean
public DialogContentProvider contentProvier() {
return new CheckBoxContentProvider();
}
ボタンをクリックすると、ダイアログが開きますが、チェックボックスにボックスがありません。
ソースコードはgithubにあります:https://github.com/gronono/bug-vaadin-checkbox
なぜ、どのように修正できるのかわかりません。メインビュー内にチェックボックスの作成を含めると、正常に機能します。
@Route("")
public class MainView extends VerticalLayout {
public MainView(DialogContentProvider contentProvider) {
// this.add(new Button("Click me!", event -> new Dialog(contentProvider.create()).open()));
this.add(new Button("Click me!", event -> new Dialog(new Checkbox("My checkbox", true)).open()));
}
}
これはこのようにひどく聞こえます(関連するgithubの問題)
基本的に、これは、チェックボックスを直接使用するビューがない場合に発生しますが、リフレクションや、場合によってはcontentProviderなどの他の手段を使用します。これは、アプリのビューにCheckbox
(->したがって、インストール中のvaadinsスキャンはの使用法を検出しないためCheckbox
、チェックボックスのnpmのものをダウンロードしません)。
githubでは、これは14.1で修正されると書かれています
今すぐ修正が必要な場合は、@ Routeを使用して任意のビューでそのタイプのフィールドを宣言したときに、修正が機能しました。そのフィールドを使用する必要はありません。
@Route("")
public class MainView extends VerticalLayout {
private Checkbox unusedCheckbox; // this line fixes it.
public MainView(DialogContentProvider contentProvider) {
this.add(new Button("Click me!", event -> new Dialog(contentProvider.create()).open()));
}
}
補遺:これはCheckbox
特にコンポーネントとは関係ありません。ルートで最初にスキャンされないが、反射、プロバイダー、または一般的な手段で使用されるvaadinコンポーネントで発生します。
編集:@Route(registerAtStartup = false)
チェックボックスを直接使用するプロバイダーにを追加することで、現在これを回避することもできます。これにより、vaadinsスキャンでチェックボックスの使用状況が確認されます(したがって、npmパッケージがインポートされます)が、実際にはプロバイダーが実際のルートとして登録されません。
あなたが複数のコンポーネントのためにこれを必要とする場合、私は好むもう一つの方法は、使用して新しいビューを作成することです@Route(registerAtStartup = false)
これだけあなたがアプリケーションに必要になります(すでに使用アレントことを各コンポーネントのプライベート変数を定義し、直接あなたのいくつかの観点では)。これには、これらすべてのコンポーネント使用法の定義が1か所にあるという利点があり、公式の修正がリリースされると、1つのクラスを削除するだけで済み、非推奨の回避策はなくなります。
@Route(registerAtStartup = false)
public class ComponentImportView extends VerticalLayout {
private Checkbox checkBox;
private Upload upload;
private ProgressBar progressBar;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加