More Related Content
Similar to 実践Knockout (20)
More from Kazuhiro Eguchi
More from Kazuhiro Eguchi (8)
実践Knockout
- 8. data-bindの例
• div要素のテキストと vm.message の値をバインド
<div data-bind="text: message"></div>
vm = {
message: hello world!
};
ko.applyBindings(vm);
- 9. hello world!を表示する例
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="../lib/knockout-2.1.0.js"></script>
</head>
<body>
<div data-bind="text: message"></div>
<script type="text/javascript" src="script.js"></script>
</body>
</html>
(function(){
var vm = {
message: 'hello world!'
};
ko.applyBindings(vm);
}());
- 10. step1 data-bind属性を設定
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="../lib/knockout-2.1.0.js"></script>
</head>
<body>
<div data-bind="text: message"></div>
<script type="text/javascript" src="script.js"></script>
</body>
</html>
(function(){
var vm = {
message: 'hello world!'
};
ko.applyBindings(vm);
}());
- 11. step2 ViewModelを定義
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="../lib/knockout-2.1.0.js"></script>
</head>
<body>
<div data-bind="text: message"></div>
<script type="text/javascript" src="script.js"></script>
</body>
</html>
(function(){
var vm = {
message: 'hello world!'
};
ko.applyBindings(vm);
}());
- 12. step3 ViewとViewModelをバインド
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="../lib/knockout-2.1.0.js"></script>
</head>
<body>
<div data-bind="text: message"></div>
<script type="text/javascript" src="script.js"></script>
</body>
</html>
(function(){
var vm = {
message: 'hello world!'
};
ko.applyBindings(vm);
}());
- 13. 6種類+ のbinding
• visible binding • style binding
• text binding • attr binding
• html binding • custom binding
• css binding
- 14. visible binding
• 要素の表示・非表示の切り替え
• いわゆるdisplay:noneのon/offの切り替え
• オブジェクトがtrueまたはnon-nullなら表示
• false, 0, null undefinedなら非表示
<div data-bind="visible: showMsg">hello world!</div>
- 32. テンプレート
• テンプレートを利用してオブジェクトを表示する
<div data-bind="template: { name: 'person-template', data: buyer }"></div>
<div data-bind="template: { name: 'person-template', data: seller }"></div>
<script type="text/html" id="person-template">
<h3 data-bind="text: name"></h3>
<p>Credits: <span data-bind="text: credits"></span></p>
</script>
vm = {
buyer: { name: 'Franklin', credits: 250 },
seller: { name: 'Mario', credits: 5800 }
}
- 33. <div data-bind="template: { name: 'person-template', data: buyer }">
<h3 data-bind="text: name">Franklin</h3>
<p>Credits: <span data-bind="text: credits">250</span></p>
</div>
<div data-bind="template: { name: 'person-template', data: seller }">
<h3 data-bind="text: name">Mario</h3>
<p>Credits: <span data-bind="text: credits">5800</span></p>
</div>
テンプレートが展開された
vm = {
buyer: { name: 'Franklin', credits: 250 },
seller: { name: 'Mario', credits: 5800 }
}
- 35. foreach binding
• 配列分要素を繰り返し追加する
<ul data-bind= foreach: users >
<li data-bind= text: name ></li>
</ul>
vm = {
users: [{name: hoge },
{name: fuga }]
}
- 36. foreach binding
• この例の場合 li 要素が2つ分表示される
<ul data-bind= foreach: users >
<li data-bind= text: name >hoge</li>
<li data-bind= text: name >fuga</li>
</ul>
users配列分繰り返し
vm = {
users: [{name: hoge },
{name: fuga }]
}
- 37. foreach bindingと自動更新
• UIを自動更新する場合はko.observableArrayを使う
<ul data-bind= foreach: users >
<li data-bind= text: name ></li>
</ul>
vm = {
users: ko.observableArray(
[{name: hoge }, {name: fuga }]
)
};
- 38. foreach bindingと自動更新
• pushで要素を追加すると li 要素も追加される
<ul data-bind= foreach: users >
<li data-bind= text: name >hoge</li>
<li data-bind= text: name >fuga</li>
<li data-bind= text: name >piyo</li>
</ul>
vm.users.push({name: piyo });
- 39. if binding
• オブジェクトがtrueの場合に要素を追加する
<div data-bind= if: show >
<span>hello world</span>
</ul>
vm = {
show: ko.observable(false);
}
- 40. ifnot binding
• オブジェクトがtrueの場合に要素を追加しない
<div data-bind= ifnot: notShow >
<span>hello world</span>
</ul>
vm = {
notShow: ko.observable(false);
}
- 41. with binding
• バインディングコンテキストを変更する
<span data-bind= text: title ></span>
<div data-bind= with: data >
<ul data-bind= foreach: users >
<li data-bind= text: name ></li>
</ul> vm = {
</div> title: hello
data: {
users: [{name: hoge },
{name: fuga }]
}
}
- 42. with binding
• vmオブジェクトのコンテキスト
<span data-bind= text: title ></span>
<div data-bind= with: data >
<ul data-bind= foreach: users >
<li data-bind= text: name ></li>
</ul> vm = {
</div> title: hello
data: {
users: [{name: hoge },
{name: fuga }]
}
}
- 43. with binding
• vm.dataオブジェクトのコンテキスト
<span data-bind= text: title ></span>
<div data-bind= with: data >
<ul data-bind= foreach: users >
<li data-bind= text: name ></li>
</ul> vm = {
</div> title: hello
data: {
users: [{name: hoge },
{name: fuga }]
}
}
- 44. with binding
• 入れ子構造のオブジェクトにアクセスしやすくなる
• 大きなViewModelを複数のオブジェクトに分割
<span data-bind= text: title ></span>
<div>
<ul data-bind= foreach: data.users >
<li data-bind= text: name ></li>
</ul>
</div>
- 45. コンテキスト変数
• $parent • $parentContext
• $parents • $context
• $root • $element
• $data
• $index
- 48. 現在の要素
• $parent • $parentContext
• $parents • $context
• $root • $element
<div id= item1 data-bind= text: $element.id ></div>
• $data
item1
• $index
- 49. working with form fields
• click binding • value binfing
• event binding • hasfocus
• submit binding • checked binding
• enable binding • options binding
• disable binding • selectedOptions binding
• uniqueName binding
- 50. click binding
• クリック人のイベントハンドラを設定する
<span data-bind= text: message ></span>
<button data-bind= click: onclick >click me</button>
vm = {
message: ko.observable(),
onclick: function(data, event){
this.message( hello world! );
}
}
- 52. イベントバブリング
• data-bind中で<イベント名>Bubbleを指定する
• クリックイベントのバブリングを止める場合
<button data-bind= click: onclick, clickBubble: false >click me</button>
- 54. 仮想要素サポート
• コメントを使ってバインドを指定できる
• 引数には更新後の値が渡される
<ul>
<li>first</li>
<!-- ko foreach: items -->
<li data-bind= text: $data ></li>
<!-- /ko -->
</ul>
- 57. custom binding
• jQueryを使ったDOM操作を隠蔽したり
• 使いこなすと結構便利
ko.bindingHandlers.<バインド名> = {
init: function(element,valueAccessor){
// applyBinding 時に一度だけ呼ばれる
// 主に element に対してイベントハンドラを追加したりする
},
update: function(element, valueAccessor){
// バインドしたko.observable()が変更されると呼ばれる
// element を更新したりする
}
};