狠狠撸

狠狠撸Share a Scribd company logo
One$%me'Binding'&'$digest
~ng#japan'2015~
?"2014"LIG"INC."@frontainer
自己紹介
林?優一!@frontainer
フロントエンドエンジニア
AngularJS関連の登壇歴
? AngularJSの今とこれから+,+フロントエ
ンドエンジニア座談会+」
? AngularJS+ディレクティブ?パターン
? 受託開発でのAngularJS+
?"2014"LIG"INC."@frontainer
One$%me'Bindingとは
バインディングを1度しか評価しないようにする機能
One$%me'bindingはAngularJS1.3から追加'(1.2以前の場合は「BindOnce」などのモジュールを使う)
?"2014"LIG"INC."@frontainer
使い方
{{::name}}
<div ng-repeat="user in ::users"></div>
ex)$demo1
?"2014"LIG"INC."@frontainer
例外
An#expression#that#starts#with#::#is#considered#a#one23me#
expression.#One23me#expressions#will#stop#recalcula3ng#once#they#
are#stable,#which#happens#a=er#the#?rst#digest#if#the#expression#
result#is#a#non2unde?ned#value#(see#value#stabiliza3on#algorithm#
below).
!!"AngularJS"Developer"Guide"!"Expressions
?"2014"LIG"INC."@frontainer
簡単に言うと???
? 値がunde?nedでなければ最初の$digestで値が保持される。
? 逆にいうとunde?nedである間は値が固定されない。
ex)$demo2
?"2014"LIG"INC."@frontainer
Watch数の違いをサンプルで見る
500件の簡単なユーザーデータを持つJSONをng)repeatでループして表示させる
[
{
"id": 1,
"name": "User1",
"value": 100
},
...
]
?"2014"LIG"INC."@frontainer
JavaScript
angular.module('app').controller('RootCtrl',[
'$scope',
'USERS',
function($scope,USERS) {
$scope.users = USERS;
}
]);
?"2014"LIG"INC."@frontainer
特に何もしない場合
<div ng-controller="RootCtrl">
<ul>
<li ng-repeat="user in users">
<div>{{user.id}} - {{user.name}}</div>
<div>{{user.value}}</div>
</li>
</ul>
</div>
ex)$demo3
?"2014"LIG"INC."@frontainer
?"2014"LIG"INC."@frontainer
配列に付けた場合
<div ng-controller="RootCtrl">
<ul>
<li ng-repeat="user in ::users">
<div>{{user.id}} - {{user.name}}</div>
<div>{{user.value}}</div>
</li>
</ul>
</div>
ex)$demo3)2
?"2014"LIG"INC."@frontainer
?"2014"LIG"INC."@frontainer
配列内のプロパティに付けた場合
<div ng-controller="RootCtrl">
<ul>
<li ng-repeat="user in users">
<div>{{::user.id}} - {{::user.name}}</div>
<div>{{::user.value}}</div>
</li>
</ul>
</div>
ex)$demo3)3
?"2014"LIG"INC."@frontainer
?"2014"LIG"INC."@frontainer
配列と配列内のプロパティに付けた場合
<div ng-controller="RootCtrl">
<ul>
<li ng-repeat="user in ::users">
<div>{{::user.id}} - {{::user.name}}</div>
<div>{{::user.value}}</div>
</li>
</ul>
</div>
ex)$demo3)4
?"2014"LIG"INC."@frontainer
?"2014"LIG"INC."@frontainer
One$%me'Bindingをしないと???
Scopeで他の値を書き換えた時にも影響を及ぼす。
?"2014"LIG"INC."@frontainer
$digestでのチェック回数
? demo1[特に何もしない場合]:*1503回
? demo*2[配列に付けた場合]:*1502回
? demo*3[配列内のプロパティに付けた場合]:*3回
? demo*4[配列と配列内のプロパティに付けた場合]:*2回
※!consoleに$digestループ実行回数が出力されます
ex)$demo4$demo4)2$demo4)3$demo4)4
?"2014"LIG"INC."@frontainer
?"2014"LIG"INC."@frontainer
Dirty&Checking
そこの値を変えなければ良いということではなく、watch対象の
値は変更されていないことをチェックされる
src/ng/rootScope.js.7262836
Object.observeの普及はいつになることやら
?"2014"LIG"INC."@frontainer
まとめ
? 双方向バインディングが必要でない場合は適切にOne%&me(
Bindingしていく
? Watch数をパフォーマンスチェック指標のひとつに
今回はChrome拡張の「Angular-watchers」を使って確認しました
?"2014"LIG"INC."@frontainer
ご静聴ありがとうございました
本日のサンプルはこちら
h"ps://github.com/frontainer/ligblog6sample
スライドはこちら
h"p://www.slideshare.net/frontainer
?"2014"LIG"INC."@frontainer

More Related Content

One-time Binding & $digest