「テンプレートでKnockout Mappingプラグインを使用して、サーバーオブジェクトから配列にマップする方法は?」というタイトルのstackoverflowでのこの交換を読んでください。(申し訳ありませんが、stackoverflowが投稿のリンク数に制限を課しています)答えを利用してプレイしようとしました(jsFiddle:http://jsfiddle.net/ueGAA/1)
そのため、この演習は、learn.knockoutjs.com で「データの読み込みと保存」という名前のノックアウト js チュートリアルの todo を作成することでしたが、ノックアウト マッピングを使用していました。
問題は、私が好きな回答のビューモデル宣言の種類にあり、ここでは todo に置き換えられています。
var viewModel =
{
tasks : ko.mapping.fromJS(data),
newTaskText: ko.observable(),
incompleteTasks: ko.computed(function() {
return ko.utils.arrayFilter(this.tasks(), function(task) { return !task.isDone() });
}),
// Operations
addTask: function() {
alert('Entering add task, count:' + this.tasks().length);
this.tasks.push(new Task({ title: this.newTaskText() }));
this.newTaskText("");
},
removeTask: function(task) { this.tasks.remove(task) }
}
ポイントはここです: ko.computed() の宣言内で、これはwindowを参照しています。さすがに普通。vewmodel 変数の後にko.computed() を宣言すると、正しい動作が得られます。
こちらです:
viewModel.incompleteTasks=ko.computed(function() {
return ko.utils.arrayFilter(viewModel.tasks(), function(task) { return !task.isDone() });
});
匿名関数でオブジェクト viewModel を静的に参照するので、私はそれが好きではありません。
問題は、ビューモデル宣言で incompleteTasks をエレガントな方法で直接宣言する方法です。jsFiddle はこちらhttp://jsfiddle.net/Yqg8e/
ありがとう