プログラミング/JavaScript/Knockout.js の履歴(No.3)
更新Knockout.js†
ブラウザ上の DOM を JavaScript で操作するために、 JavaScript 上の ViewModel オブジェクト と DOM とを リンクさせ、ViewModel の変更が自動的に DOM に 反映されるようになる超お手軽なライブラリ
非常に使いやすいテンプレート機能や、 Computed Observable によるデータ依存関係の追跡も、 地味に重要な機能
と理解しました。
最近は prototype.js ははやらないので、
- html5 : 最新の html 標準
- css3 : 最新の css 標準
- jQuery : 汎用ライブラリ 主に DOM 操作
- Knockout.js : View-ViewModel 関係を構築するためのフレームワーク
- knockout.validation.js : Knockout.js 上での Validation ライブラリ
- Underscore.js : 汎用ライブラリ
- reset.css : ブラウザ依存スタイルのリセット用コード
- html5shiv.js, css3-mediaqueries.js : 古い IE 対策
あたりを使うのが定番なのでしょうか?
情報源†
- Knockout.js 日本語ドキュメント
http://kojs.sukobuto.com/tips/contactsEditor - Demo & Tips - Knockout.js 日本語ドキュメント
http://kojs.sukobuto.com/tips/ - HTML5のテンプレートを用意する
http://www.sichoru.net/2013/08/522
試しに学会アブストラクトのWeb投稿フォームを作ってみる†
未稿
気付いたこと†
以下の2つは knockout.validation の Issue #354 で解決済みだと思います†
https://github.com/Knockout-Contrib/Knockout-Validation/issues/354
このあたりのコードを見ていると、まだまだ枯れたライブラリとは 言えないようで、自己責任で使っていくしかない感じがひしひしと。
子オブジェクトに親オブジェクトへのリンクを持たせてはならない†
ここでの親子は継承関係ではなくてコンポジット関係。
あと、恐らく knockout.validation の問題かも。
子オブジェクトが親オブジェクトへのリンクを持っていると、 ko の依存関係の検出時に無限ループしてしまうみたいです。
// これはダメ
Child = function(parent) {
this.parent = parent;
};
Parent = function() {
this.child = new Child(this);
};
Parent 依存している Child が依存している Parent が依存している Child が・・・
と追っていってブラウザが固まります(泣
どうしても Child に Parent へのリンクを持たせたいときは、 関数にすれば回避できるようです。
// これならOK
Child = function(parent) {
this.parent = function(){ return parent; };
};
Parent = function() {
this.child = new Child(this);
};
子オブジェクトが親オブジェクトを知っていなければならないという時点で 設計がおかしいという指摘もあるかと思いますが、全体の調和を見るような Validation を実装しようとすると親へのリンクが欲しくなる場合があるような?
もっと良い回避方法があるのかもしれないですが、とりあえずメモということで。
そうじゃなくても依存解析に非現実的な時間がかかることがある?†
knockout.validation の traverse がものすごく時間がかかる。
理由を調査中。
observable に結びつけられた UI が正しく更新されないとき†
knockout の UI を強制的に refresh するには、
observable.valueHasMutated();
を呼べばいいそうです。
普通はそういうことは起きないはずなんですが、 ObservableArray.sort と select の組み合わせで select の表示がおかしくなり、 それを正しく戻すために .valueHasMutated() が必要でした。(knockout-3.0.0.js)