比較的大きなデータセットを表示および更新する必要があるJavaScriptベースのVaadinコンポーネントを実装しています。私はAbstractJavaScriptComponent
を拡張してこれをやっています。VaadinのAbstractJavascriptComponentの部分的な状態の変更
私は、RPCを使ってサーバーとユーザーのやりとりを委任し、共有状態を更新するJS側をできるだけ「ダム」に保ちようとしています。 JSコネクタラッパーのonStateChange
関数が新しい状態で呼び出されると、それに応じてDOMが更新されます。
- 私は小さな部分が更新されるたびにセット全体のデータを転送する必要はありません。
- 私は毎回UIを完全に再構築したくありません。
私は前の状態を維持し、その部分を比較して何が変更されたかを知り、必要なDOMを変更するだけで解決できます。 しかし、それでも最初の問題が残っています。
私はVaadinの共有状態メカニズムの使用をやめ、その変更を状態に伝達するためにRPCを使用するだけですか?
更新: 私はいくつかのテストを行ってきた、そして確かにVaadinの共有状態メカニズムは、効率の面で恐ろしいであることが表示されます:
コンポーネントがでいくつかのプロパティを更新するためにgetState()
を呼び出すたび(または何も更新しなくても)状態オブジェクト全体が転送されます。これを避ける唯一の方法は、共有状態メカニズムを使用せず、RPC呼び出しを使用して特定の状態変更をクライアントに伝えることです。
解決方法RPCのアプローチにはいくつかの問題があります。例えば、1回の要求/応答サイクル内で値を複数回変更する場合は、RPC呼び出しを複数回実行する必要はありません。代わりに、共有状態メカニズムが応答内の最終状態のみを送信するように、最後の値だけを送信するだけです。別々に送信したい(または以前の状態のコピーを保持して比較する)状態の各部分に対して汚れたフラグを保持できますが、要求処理の最後に何らかの方法でRPC呼び出しをトリガする必要があります。これはどうすればできますか?
これに関するアイデアは大歓迎です!
アップデート2:
Vaadin 8つのフィックス根本問題:それだけで変更された状態のプロパティを送信します。また、RPCコールだけを行うとき(そして状態を変更しないとき)、JSコネクタ上でonStateChange()
を呼び出すことはありません。
まさに私が探していた答え。 encodeStateをオーバーライドするときに完全な状態を送信しないことで「不正行為」を行っている場合、切り離しや接続に関する警告はありますか?例えば、完全な状態が切り離されて再接続された後に送られるべきであるか? – herman
残念ながら、私は今、答えを受け入れなくてはなりません。その理由は、 'AbstractComponent#beforeClientResponse(boolean initial)'が 'getState()'を繰り返し呼び出すので、フル状態の転送( 'onStateChange()' JS関数の呼び出し)を防ぐことができないためです。汚れた。もちろん、上書きすることはできますが、コードが理由で存在していると確信しています。 IMOこれはVaadinのバグです。 – herman
[このチケット](https://dev.vaadin.com/ticket/19828)を問題追跡担当者に提出しました。私はそれを回避するためにいくつかの方法を見つける必要があります。 – herman