web-dev-qa-db-ja.com

双方向のデータバインディングは、単純な自動同期とどう違うのですか?

AngularJSのドキュメント は、一方向のデータバインディングを「悪い」と見なし、双方向のデータバインディングを「良い*」と見なすことを述べています。ただし、使用されている双方向データバインディングの定義を確認すると、ビューとモデルの間に自動同期が設定されているだけのようです。

Two-Way Data Binding

確かに、これはパフォーマンスに影響を与え、追加のリソースを使用します。それとも何か不足していますか?双方向データバインディングはMVC自動同期以上のものであり、双方向データバインディングをalwaysにすることが望ましいデータバインディング理論の側面はありますか?ドキュメンテーションと図に暗示されているようですか?

*これは、上に見られるように、言葉ではなく悲しい笑顔でこれを行います...

1
Guy Incognito

ドキュメントから、「ほとんどのテンプレートシステム」によって、ビューにレンダリングされるサーバー側のテンプレートを主に参照していると想定しています。 angularが異なる理由:「...テンプレート...がブラウザーでコンパイルされます。コンパイル手順によりライブビューが生成されます。」また、他のクライアント側 [〜#〜] mvvm [〜#〜] / [〜#〜] mvc [〜#〜] / [ 〜#〜] mvp [〜#〜] (別名MV *)ライブラリは、同様の双方向バインディングを提供します。

サーバーサイドテンプレートの場合、ビューは実際にはブラウザーではなくサーバー上でレンダリングされるため、「ライブビュー」になることは通常ありません。これにより、本質的にサーバー側バインディングが一方向になります。クライアントは変更を送信する必要があります。次に、サーバーはバインディング値を再計算し、それらの値から新しいビューをレンダリングします。私は従来のフォームベースのページについて話しているだけではありません。これは、サーバーで計算されるビューのパーシャルを非同期にロードするフレームワークにも同様に適用されます。

角度では、モデルとコントローラーがビューと一緒に存在します。したがって、ユーザーがビューの値を変更すると、モデルですぐに変更され、コントローラーはその変更に対応できます...計算された値の再計算、関連データの読み込みなど。ただし、他のクライアント側ライブラリも可能ですこれの。

angularはディレクティブに内部的に一方向と双方向のバインディングがあるため、この用語はここでは適切ではないと言えます。これは問題を少し混乱させます。しかし、ディレクティブの場合、モデルプロパティが読み取り専用(一方向)として公開されているか、読み取り/書き込み(双方向)として公開されているか(それだけではありませんが、それが要点です)。

更新

そのため、このページはReactJSのようなものをターゲットにしているように見えますが、サーバー側の技術者にも適用できます。これは興味深い(偏った) 記事 で、一方向と双方向のバインディングについてさらに議論しています。 (Reactは一方向です。)

0
Kasey Speakman

MVCさえ何であるかについて無数の議論があったため、Angular.jsのフードの下で行われていることをMVCに単純化することに注意しますAngularはMVCまたはMVVMまたはその他のMV *パラダイムを実装します。これはAngularが実装する世界で受け入れられるようになります Model-View -Whatever のままにしておきます。

そうは言っても、双方向バインディングの部分はかなり単純です。ビューのhtml要素とjavascriptモデルがクライアント上で常に同期していることを保証するのは、javascriptの一部にすぎません。モデルが変更されると、ビューが更新され、ビューが変更されると、モデルもクライアント上でほぼリアルタイムで更新されます。

これは、モデルが提供するものを使用してビューに適用する一方向のバインディングとは対照的ですが、ビューを変更してもモデルは更新されません(サーバーへの往復がない場合)。

Angularのようなクライアント側のライブラリの場合、双方向のデータバインディングがリアルタイムのインタラクティブなWebページの基礎であるため、双方向のデータバインディングがどれほど優れているかを簡単に確認できます。多くのページ要素は、それらのレンダリングについて(双方向バインディングを介して)モデルの状態に依存する可能性があり、そのモデルの状態は、操作されているビューの一部に応じて変化するため、ビューの他の部分も更新される場合があります。一方向のバインディングでは、それは不可能です。

0
Eric King