同期は、2方向、1方向、および任意の方向の両方で可能です。
Webベースのアプリケーションのレベルの開発により、JavaScriptで同様のソリューションを実装することが可能になりました。 さて、データをプレゼンテーションから分離することの利点は、すでに多くの場所で議論されており、ホリバーに何度もつながっていると思うので、この点を見逃しましょう。 たとえば、DOM構造の従来のデータストレージでは、何百ものチェックマークを何らかの形式(formBody)で保存する方法を次のように実装できます。
$( 'table#formBody input[name="available"][change=true]' )
「change」フラグを使用して選択を最適化します、つまり、変更された要素のみを選択し、各チェックマークにはidRefタグ(可用性が反映される要素のID)が含まれます。今、すべての要素を選択し、それらを繰り返し、ハッシュ配列に転送します
var find = {skills: []};
$j( 'table#formBody input[name="available"][change=true]' ).each(
function (index, el){
find.skills.push({ id: $j(el).attr( 'idRef' ), val: ($j(el).attr( 'checked' ) ? 1 : 0) });
}
);
ネイティブのJavascript機能では、コードはかなり面倒です。説明はしませんが、本質は変わりません。
マイナスは明らかであり、データはDOM全体に非常に広がっているため、モデルロジックまたはプレゼンテーションフォームを編集するとエラーが発生することがよくあります 特に、完成したhtmlがphpから来ている場合は、2つのファイルを編集する必要があり、これもエラーにつながる可能性があります。 既製のJavaScriptデータバインディングソリューションを探して、たとえば、 jPop 、 JQBinder 、 Databind プラグイン 、 jBind 、 JSRepeater 、 Chainを見つけたjQueryプラグインの中でのみ、多くのソリューションがあることがわかりました。
順番に考えてみましょう。
jPop
機能:
- アレイのサポート。
- ビューからモデルへの一方向の同期。
- オブジェクトフィールドを添付したいタグフィールドを選択することはできません。
- ローカルモデルはデータソースとして使用されます。
- ドキュメントなし
<h1 id= "greeting" class = "jpop_class" ></h1>
<p id= "greetingProp.greeting" class = "jpop_class" ></p>
<p>And,
<span id= "greetingProp2:greetingArray" class = "jpop_class" >
<br><span id= "greetingArray.greeting" class = "jpop_class" ></span>
</span>
<script type= "text/javascript" >
$j( function () {
var jso= {
greeting: "Hello, World!" ,
greetingProp: {
greeting: "Hello again, World!"
},
greetingProp2: {
greetingArray: [
{ greeting: "Hello, Nick!" },
{ greeting: "Hello, Sri!" },
{ greeting: "Hello, Jody!" },
{ greeting: "Hello, Andrew!" },
{ greeting: "Hello, Heather!" },
{ greeting: "Hello, Ben!" }
]
}
};
$j( '.jpop_class' ).jpop(jso);
});
Jqbinder
機能:
- 通常の例はありません
- 説明なし
- ドキュメントなし
- 同期なし
<div id= "#target" >
<img src= '$(.profile_image_url)' />
<div>$(.text)</div>
</div>
Then, simply call
$( "#stage" ).dataBindTo( { urlToJSONP, options } );
テンプレートエンジンでも機能が不十分であり、ローカルモデルを操作できないため、その有用性はゼロになります。
データバインドプラグイン
機能:
- ビューにバインドされているモデルのマップがあります
- 同期なし
- ローカルモデルは、データソースおよびバインディングマップとして使用されます。
- ドキュメントはありませんが、多くの例があります
例:
< form action ="#" id ="form1" >
< label for ="txtName" > Name </ label >< input type ="text" id ="txtName" >< br >
< label for ="txtAge" > Age </ label >< input type ="text" id ="txtAge" >< br >
< label for ="drpGender" > Gender </ label >< select id ="drpGender" >< option value ="0" > Female </ option >< option value ="1" > Male </ option ></ select >
</ form >
var map = { name: '#txtName' , age: '#txtAge' , gender: '#drpGender' , genders: '#drpGender' };
var data = { name: 'Jane Doe' , age: 27, genders: [[0, 'Female' ], [1, 'Male' ]], gender: 0 };
$( '#form1' ).binddata(data, map); //Bind with a map
jBind
機能:
- ローカルモデルは、データソースおよびバインディングマップとして使用されます。
- 同期なし
例:
< div id ='template2' style ="display:none;" >
< div class ="content" >
<!--data-->
< div class ="viewBlockLeft" id ='{id}' >
#{id} < br />
< b > {name} {family} </ b > , < br />
< i > {education} </ i > , < br />
</ div >
<!--data-->
< div class ="clear" ></ div >
</ div >
</ div >
var template = $( '#template2' ).html();
var data = [
{
id:41,
name: 'Scott' ,
family: 'Adams' ,
education: 'Economics'
},
{
id:59,
name: 'Jack' ,
family: 'Welch' ,
education: 'Chemical Engineering'
}
];
alert($(template).bindTo(data));
JSRepeater
機能:
- データをフォーマットする機能。
- 配列とツリーのサポート。
- ローカルモデルはデータソースとして使用されます。
- 組み込み変数のサポート。
- 同期なし。
使用例:
<script>
var myData = { "Name" : "Google" , "Type" : "Search Engine" , "URL" : "www.google.com" };
$( '#template1' ).fillTemplate(myData);
</script>
<body>
<div id= 'template1' >${Name} is a ${Type} found at <a href= '${URL}' >${URL}</a></div>
</body>
チェーン
機能:
- 優れたドキュメント。
- イベントを介してモデルと同期する機能、および同期プロセスを制御する機能。
- モデルごとにデータを検索します。
- データをフォーマットする機能。
- ドラッグアンドドロップビューを実装する
- たくさんの例
例:
$( '<div><div class="name"><span class="first">First</span> <span class="last">Last</span></div></div>' )
.item({first: 'Steve' , last: 'Jobs' })
.chain({
'.name .first' : {
style: 'color: blue;' ,
content: 'First Name: {first}'
},
'.name .last' : 'Family Name: {last}'
})
.appendTo( document .body);
以下にテーブル生成の例を示しますhttp://javascriptly.com/2008/08/a-better-javascript-template-engine/
別の例:
< div id ="contact" >
< div class ="name" > My Name </ div >
< div class ="address" > My Address </ div >
< div class ="country" > Unknown Country </ div >
</ div >
$( '#contact' ).item({
name: "Rizqi Ahmad" ,
address: "Somestrasse 50, Hamburg" ,
country: "Germany"
}).chain({
'.name' : 'Hello, My Name is {name}' ,
'.address' : 'My address is {address}' ,
'.country' : 'It is in {country}'
});
その結果、次のことができます。
< div id ="contact" >
< div class ="name" > Hello, My Name is Rizqi Ahmad </ div >
< div class ="address" > My address is Somestrasse 50, Hamburg </ div >
< div class ="country" > It is in Germany </ div >
</ div >
要約すると、同期バインディングだけが必要な場合は、jPopに注意を払い、少し変更する必要があります。 プレゼンテーションが単なる入力に限らず、動的なタブレット、リスト、ツリー、並べ替えオプション、ドラッグアンドドロップの操作を伴う場合、raid-oxのライブラリの機能を真剣に検討する価値があります。 jQuery + Chain + Interactionは、コンパクトで読みやすいWebアプリケーションを設計するためのJavaScriptプログラマーの生活を大幅に簡素化します。
素敵なプログラミングをしてください!