11

タブ付きのインターフェースがあり、これらのタブの1つの中にプライバシーフォームがあります。このプライバシーフォームは、その作業の大部分に外部JavaScriptファイルを使用するだけでなく、現在動的コード(サーバー側言語)に依存しているため、インラインJavaScriptも使用します。

formTabsラッパー(コールバック関数のないajaxタブ)

...
<script type ="text/javascript">
    var messagingTabset = ProjectName.Tabset.init({
        'tabID': 'preferences-tabset',
        'ajaxUrl0': '<%=Url.Action("PreferencesMainForm", "Profile")%>',
        'ajaxUrl1': '<%=Url.Action("ProfileImageForm", "Profile")%>',
        'ajaxUrl2': '<%=Url.Action("InterestsForm", "Profile")%>',
        'ajaxUrl3': '<%=Url.Action("PrivacyForm", "Profile")%>',
        'ajaxUrl4': '<%=Url.Action("PasswordForm", "Profile")%>',
        'ajaxUrl5': '<%=Url.Action("CustomUrlForm", "Profile", new {userId = Model.UserId})%>',
        'defaultAjaxUrl': '<%=Url.Action(Model.PartialName, "Profile")%>'
    });
</script>
...

privacyFormビュー(サーバー側コードを使用したよりインラインのJavaScript)

...
<script type = "text/javascript">
    var preferencesPrivacyForm = new ProjectName.AJAX.Form({
        "ajaxFormID": "preferences-privacy-form",
        "actionUrl": '<%= Url.Action("SavePrivacy","Profile") %>',
        "dataReturnType":"json"
    });
</script>
...

バックエンド開発者:「このフォームの構成JavaScriptコードはprivacyFormビューにとどまる必要があります」

フロントエンド開発者:「うーん、私はこれを行う方法ではないと確信しています」-信頼できない、すべてのJavaScriptは、タブラッパーを含むHTMLページ内、タブロードのコールバック関数内にある必要があります。あなたは本当にa)タブ内の動的データを取得するためのロジックを提供する必要があります-ラッパーまたはb)DOMトラバーサルを介してそれらの動的変数を取得させてください」

バックエンド開発者:「これらの方法はどちらも、実際の見返りがないために多くの作業が必要です。最初の例は、構築方法を変更する必要があることを意味するため、悪いです(そして正常に機能します)。 2番目の例は、マークアップが変更される可能性があるため危険です。そのため、コードで作業している人がタブラッパーのDOMトラバーサルメソッドを編集するのを忘れる可能性があります。これは、私たちが必要としない別のレベルの抽象化です。なぜこれが本当に本当に悪いのかについてのいくつかの証拠がありますが、それ以外の場合は時間をかけることを正当化することはできません。」

フロントエンド開発者:'ええと、私はすでに数日を無駄にして、ラッパーのコールバックにAJAXがロードされたJavaScriptを配置することで問題を修正しましたが、そうです、今あなたはそれについて考えます、この種のものに関する良いリファレンスは本当にいいですね、あなたが正しいので、現時点では、アプリケーションは問題なく実行されています。

これは、Ajaxを使用してインラインJavaScriptをロードしている大規模なアプリケーション全体の多くの例の1つです。

バックエンド開発者にコールバックを使用する必要があることを納得させる必要がありますか、それとも何かが足りませんか?

4

4 に答える 4

5

Dale Carnegie の How to Win Friends and Influence People を読むことをお勧めします。

開発者は常にこの状況に陥っているようです。彼らは何が最善かを知っていますが、他の開発者や管理者からの賛同を得られません。

この本は間違いなく読む価値があります。この職業のために絶対に読む必要があります。

于 2010-06-16T08:23:19.533 に答える
5

目的を果たしている限り (たとえば、WordPress ダッシュボードのような他の Web サイトからコンテンツをロードするなど)、「悪い」わけではありませんが、絶対に必要でない限り、サーバーへのすべての余分な呼び出しを行うことはリソースの無駄です。やれ。

通常、最も単純な答えが最も正しい答えです。この場合、バックエンドのわずかな再コーディングを避けるために余分なオーバーヘッドをすべて追加しないことを意味します。

于 2010-06-16T15:16:11.993 に答える
1

これが、控えめなJavascript(UJS)が優れている理由についての議論の核心です。インラインJavascriptなしで問題を解決する方法がわからなかったので、そのメリットを理解できませんでした。私は最終的に学びました。

まず、UJSは、フロントエンドコードを次のように分離するので優れています。

  1. HTML-純粋なHTMLは、情報を構造化するためのものです。
  2. CSS-CSSは、ドキュメントのスタイルとレイアウトに使用されます。
  3. Javascript-Javascriptは、ページの動作を定義するために使用されます。

それらを連携させるために、HTMLファイルを外部CSSファイルにロードしてスタイルを定義し、外部Javascriptファイルをロードして動作を定義します。さらに、JavaScriptが動作の実装に従って構造、レイアウト、およびスタイルを操作できるように、HTML(ID、クラス名、タグなど)、CSS(IDおよびクラスルール)によく知られたシンボルが必要です。

jQueryなどのJavascriptフレームワークを使用すると、JavaScriptハンドラーをさまざまなHTMLDOMオブジェクトのイベントに動的にバインドできます。これにより、HTML内でインラインで実行することを回避できます。

私は、明確に分離されたコード(構造、スタイル/レイアウト、動作)と、ERBを使用して動的に生成されたHTML / JSコードを含む、HTML、CSS、およびJavascriptの朝食であるコードを使用しました。どちらもさまざまな理由で理解するのが困難でした。最初のファイルは、各ファイルの内容を理解する必要があるため困難でしたが、混合コードは、JS、HTML、CSS、初期化時期、および内容を理解する必要があるため、理解するのが困難でした。生成されました。ただし、学習曲線に乗ると、きれいに分離されたコードを進化させることは、作業が少なくなり、テストが容易になりました。

生成されたJavascript(ERBなど)の場合、通常、ユーザー固有またはコンテキスト固有のデータによって駆動される静的javascriptがあるコードを構造化できます。前の人が提案したように、HEADセクションでそのデータの値を設定してから、静的Javascriptファイルを使用することができます。AJAX呼び出しを使用して、サーバーから同じデータを取得することもできます。

短期的なビジネスの観点からは、バックエンドの人は正しいです。それが機能する場合は、修正しないでください。中期的には、HTML、CSS、およびJavascriptをUJSで明確に分離しないと、チームがコードを進化させて維持するためにより多くのコストがかかります。ビジネスの観点からは、今日のようにコードを維持および進化させるのは大変なことです。バックエンドの人のビジネスの観点から、彼が今日うまくいくこと以外のことをするならば、それは彼にもっと費用がかかるでしょう。つまり、チームリーダーとアーキテクトは、コードを構造化する方法を決定するために、さまざまなビジネスの観点のバランスを取る必要があります。

于 2010-06-24T14:33:58.857 に答える
0

It's not clear from the example why you would need AJAX in the first place. Why not just put

<script type ="text/javascript">
    var userId = "<<<<= userId >>>>"
</script>

directly into the HTML head? It is faster for the user, easier on the server, and you avoid all sort of pains with timing and error handling for failed requests.

于 2010-06-21T19:12:19.043 に答える