16

最近、特に Ember.js、Can.js、Knockout.js、Backbone.js などの JavaScript フレームワークや、より伝統的には Cocoa や Objective で、「バインディング」と「ライブ バインディング」という用語をよく目にします。 -C では、バインディングとは正確には何なのだろうか? (そして、「ライブバインディング」とは正確には何ですか?)。

大雑把に言えば、「A を B にバインドする」ことができ、「A は B にバインドされる」と言えます。つまり、B の変更は A に自動的に反映されます。ユーザーは心配する必要はありません。オブザーバーをセットアップする必要がありますが、オブザーバーは以前に自動的にセットアップされ、B が変更されると自動的に通知されます。

これを行うと、「バインディング」が作成されます。

より厳密に言えば、Cocoa と Objective-C では次のように定義されているようです: バインディングはオブジェクト A のプロパティ であり、このプロパティは監視され、オブジェクト Bfooのプロパティの値に変更されます。bar気にする必要はなく、(ブラック ボックスのように) 非表示にする必要があり、通常は Observer パターンによって実装されます。したがって、「バインディング」という言葉は、実際にはアクションではなく「プロパティ」を意味します。このプロパティは監視され、他のプロパティと同じ値に変更されます。

また、このバインディングは、データにバインドされている UI 要素に限定されません。これは、小さい UI 要素を含む外側の大きな UI 要素にすることができ、外側の UI 要素には、内側の UI 要素のプロパティにバインドされたプロパティがあります。または、別の非 UI データ プロパティにバインドされた 1 つの非 UI データ プロパティにすることもできます。

これはバインディングとは正確には何ですか?そして、ライブバインディングはどうですか?

4

4 に答える 4

1

歴史については定かではありませんが、この意味での「バインディング」という用語は、「データ バインディング」という用語から派生したものではないかと推測されます。「データバインディング」は確かにアクションです。たとえば、フォーム内のフィールドにデータベースからのデータが入力され、自動的に更新される場合など、実際のデータ、AKA モデルからの値を UI コントロールに入力します。 . バインディングの主な違いは、一方向と双方向にあると思います。双方向のデータ バインディングでは、モデルからビューにデータを同期するだけでなく、ユーザー入力もモデルに同期されます。

「bind」は動詞であり、「data-binding」の動詞形式は「bind data」または「perform data-binding」です。2 番目の例は、「データ バインディング」も名詞であり、「データ/モデル プロパティを UI/ビュー プロパティにバインドする行為」として定義できることを示しています。「バインディング」自体の名詞バージョンに関しては、通常、2 つのプロパティ間の個別のバインディングを指すという点で正しいと思います。これを視覚的に示すために、ドットが互いにバインドされた 2 つのプロパティを表しているとします。

• ----- •</p>

ここでの「バインディング」は、それらの間の線です。

より具体的に言うと、一方向バインディングは 1 つの矢印で表すことができます。

• ----> •</p>

そして、2 つの矢印による双方向バインディング:

• <---> •</p>

「ライブ バインディング」は、オブザーバー パターンが使用されていることを示すために使用される用語です。私の推測では、"ライブ バインディング" を区別したいという要望は、ページが最初に読み込まれるときに、HTTP 要求ごとに 1 回だけデータ バインディングが発生するフレームワークを以前に使用したことがある Web 開発者から来た可能性があります。Javascript を多用する Web アプリが標準になりつつある現在 (部分的には ajax のおかげ)、MVC の元の定義で提案されているように Observer パターンを使用しない理由はありません。そのため、「ライブ バインディング」はおそらく RIA に関して不要な用語です。またはネイティブ デスクトップまたはモバイル アプリ。

余談ですが、Trygve Reenskaug の MVC の最初のビジョン (彼が考案したもの) は、基本的にエンド ユーザーのメンタル モデルをシステムに反映することであり、その結果、「モデル」は、ユーザーがほとんど直接操作しているもの (または、少なくともそのように感じるもの) になります。ユーザー)。したがって、オブザーバー パターン (または少なくともページをリロードせずにモデルとビューの同期を維持するメカニズム) が不可欠であり、サーバー側にほとんどのコードを持つ Web 開発フレームワークは、当初考えられていた MVC ではありませんが、むしろ、コード編成に関して同じ一般的な考え方に従うバリアントです。主にクライアント側アプリ向けの最新の Javascript フレームワークにより、Web 開発で真の MVC が可能になります。

あなたの質問に戻って、バインディングは必ずしもモデル プロパティとビュー プロパティの間にあるとは限らないと言うときも正しいと思います。2 つのモデル プロパティ (通常は異なるモデル) の間、または 2 つのビュー プロパティの間である可能性があります。しかし、「バインディング」はプログラミングに関する名詞にすぎないというあなたの主張には同意しません。明らかに英語では動詞「バインド」の名詞形、つまり「バインディングの行為」であり、それは有効だと思います。プログラミングでの使用も。本質的に私が言っていることは、それには二重の意味があるということですが、あなたが提案した定義が最も一般的だと思います。正式な定義での私の試みは次のとおりです。

バインディング。

  1. 2 つのプロパティ (通常は 2 つの異なるオブジェクト) 間の接続で、プロパティを互いに同期させます。つまり、同じ値を持ちます。同期は、単方向または双方向のいずれかです。
  2. そのような接続を開始する行為。
于 2013-06-02T04:50:00.827 に答える
0

これは、バニラ JavaScript での .bind メソッドの元の使用法と同じです。オブジェクトのスコープをメソッドにバインドします。

と を検討this.iterable.map( this.flush )してくださいthis.iterable.map( this.flush.bind(this))。最初に、単純に this の iterable プロパティの反復ごとにメソッドを実行していますが、this.flushメソッドがプロパティにアクセスするにはthis、それを にバインドする必要がありますthis

同様に、Ember のようなフレームワークでは、モデルは宣言です。そのモデルをリモート ソースから設定するには、インスタンスが必要です。ハンドルバーからモデルを変更するには、インスタンスが必要です。UI の変更がモデル インスタンスにすぐに影響する場合、それらはバインドされています。

疑似コード: UI.view.bind(modelInstance) RemoteSource.bind(modelInstance)

私の経験では、"Live-Binding" は、UI が変更されるとすぐにデータをリモート ソースにバインドすることです。

疑似コード: UI.view.bind(modelInstance) RemoteSource.bind(modelInstance) modelInstance.onChange(RemoteSource.update.bind(modelInstance))

于 2017-12-07T21:43:41.923 に答える
0

非常に単純な意味でのバインドとは、リンクすることを意味します。たとえば、プログレス バーと変数 X があり、ボタンをタップするたびに X の値がインクリメントされるとします。Binding を使用すると、X の値を (増分するたびに) 取得し、進行状況バーに表示できます。C# の次のコード行で、「pb」はプログレスバーで、TapCount は合計タップ数が保存される変数です。「pb」の値が変数 TapCount にバインドされていることを示しています

public void tapping
{    
 pb.Value = TapCount; 
}
于 2015-03-10T10:57:25.433 に答える