物事を面白く保ち、私の最後の未解決の質問を締めくくるために、適切なアーキテクチャを使用して適切に整理された方法で以下の機能を実装するソリューションは、かなりの恩恵を受けます. 完全なコードは jsfiddle にあります。質問があればお気軽にどうぞ :)
クライアント側で非常にリッチな複雑な Web アプリケーションを通常どのように編成しますか。大規模なアプリでうまく管理されていない場合に陥りやすい混乱の種類を示すために、不自然な例を作成しました。この例を自由に変更/拡張してください - http://jsfiddle.net/NHyLC/1/
この例は、基本的に SO のコメント投稿の一部を反映しており、次の規則に従います。
- 複数のスペースが 1 つに切り捨てられた後、最低 15 文字が必要です。
Add Comment
をクリックしても、複数のスペースを削除した後のサイズが 15 未満の場合は、ポップアップにエラーが表示されます。- 残りの文字数を示し、色分けして要約します。グレーは小さなコメント、茶色は中程度のコメント、オレンジは大きなコメント、赤はコメントのオーバーフローを示します。
- コメントは 15 秒ごとに 1 つしか送信できません。コメントの送信が早すぎる場合は、適切なエラー メッセージを含むポップアップを表示します。
この例で気付いたいくつかの問題。
- これは、ウィジェットまたは何らかのパッケージ機能であることが理想的です。
- 15 秒ごとのコメントや最小 15 文字のコメントなどは、各ウィジェット内に埋め込まれているのではなく、一部のアプリケーション全体のポリシーに属しています。
- ハードコードされた値が多すぎます。
- コード編成なし。モデル、ビュー、コントローラーはすべてバンドルされています。MVC がリッチ クライアント側の Web アプリケーションを編成するための唯一のアプローチというわけではありませんが、この例にはありません。
これをどうやって掃除するつもりですか?途中で少し MVC/MVP を適用しますか?
関連する関数の一部を次に示しますが、jsfiddle でコード全体を見た方がより理にかなっています。
/**
* Handle comment change.
* Update character count.
* Indicate progress
*/
function handleCommentUpdate(comment) {
var status = $('.comment-status');
status.text(getStatusText(comment));
status.removeClass('mild spicy hot sizzling');
status.addClass(getStatusClass(comment));
}
/**
* Is the comment valid for submission
* But first, check if it's all good.
*/
function commentSubmittable(comment) {
var notTooSoon = !isTooSoon();
var notEmpty = !isEmpty(comment);
var hasEnoughCharacters = !isTooShort(comment);
return notTooSoon && notEmpty && hasEnoughCharacters;
}
/**
* Submit comment.
* But first, check if it's all good!
*/
$('.add-comment').click(function() {
var comment = $('.comment-box').val();
// submit comment, fake ajax call
if(commentSubmittable(comment)) {
..
}
// show a popup if comment is mostly spaces
if(isTooShort(comment)) {
if(comment.length < 15) {
// blink status message
}
else {
popup("Comment must be at least 15 characters in length.");
}
}
// show a popup is comment submitted too soon
else if(isTooSoon()) {
popup("Only 1 comment allowed per 15 seconds.");
}
});
編集1:
@matpol ラッパー オブジェクトとプラグインの提案をありがとう。これは、既存の混乱を大幅に改善するものです。ただし、プラグインは独立したものではなく、前述のとおり、より大規模で複雑なアプリケーションの一部になります。クライアント/サーバー側のアプリケーション全体のポリシーは、コメントの最小/最大長、ユーザーがコメントできる頻度などを決定します。プラグインには、この情報をパラメーターとして供給することができます。
また、リッチ クライアント側アプリケーションの場合、データを html 表現から分離する必要があります。これは、アプリケーションがデータを認識し、物事をローカルに保存し、サーバー上で定期的に更新できるため、多くのサーバー ラウンドトリップを節約できるためです。 、またはアプリケーション自体内の興味深いイベント (ウィンドウが閉じられたときなど) が発生したとき。これが、プラグインのアプローチがあまり好きではない理由です。パッケージ化された表現を提供する場合と同じように機能しますが、それでもDOMを中心にしているため、アプリケーションにそのようなプラグインが20個ある場合、これは決してばかげた数ではありません.