データが AJAX 経由で読み込まれるため、データが到着したときにデータを更新する必要があります。
ページの読み込み時に、データベースにプロジェクトを収集します。次に、選択されているプロジェクト (self.SelectedProject) に応じて、タスクとタグのデータを読み込みます。
self.Projects = ko.observableArray();
self.Tasks = ko.observableArray();
self.Tags = ko.observableArray();
self.SelectedProject = ko.observable(); // Chosen Project-object...
初期化のために、最初のプロジェクトのデータをロードします。
self.SelectedProject(self.Projects()[0]); // Choose first returned Project...
次に、タグを支援する配列を設定します。
ko.computed(function () {
// must be ko.computed as else will not update when data arrives for Tags and Tasks (which are likely to be empty at load time)...
// Empty projectAvailableTags before refill...
self.SelectedProject().projectAvailableTags([]);
// First populate current project's "projectAvailableTags"-array with values...
for (var j = 0, jlen = self.Tags().length; j < jlen; j++) {
self.SelectedProject().projectAvailableTags().push(self.Tags()[j].TagName());
}
for (var i = 0, ilen = self.Tasks().length; i < ilen; i++) {
//---- Populate each TaskTag-array with Tags...
for (var j = 0, jlen = self.Tags().length; j < jlen; j++) {
if (self.Tags()[j].TagTaskId() === self.Tasks()[i].TaskId) {
self.Task()[i].TaskTags.push(self.Tags()[j]);
// Populate the different tag-Arrays...
var tagtype = self.Tags()[j].TagType;
switch (tagtype()) {
case 0: self.Tasks()[i].Location().push(self.Tags()[j].TagName()); break;
case 1: self.Tasks()[i].Manager().push(self.Tags()[j].TagName()); break;
case 2: self.Tasks()[i].Employee().push(self.Tags()[j].TagName()); break;
}
}
}
};
});
これはおそらく奇妙に見え、不必要に複雑なことをしているのかもしれません。http://aehlke.github.com/tag-it/をタグ マネージャーとして使用 しており、TagNames のみの配列が必要です。したがって、Tags()-array を直接使用する方法がわかりませんでしたが、それを望んでいます。
タスクはアコーディオンで表示されます。コンテンツ パネルにタスク タグを適用したいのですが、プロジェクト タグを autocomplete 機能の tagSource として使用しています...
しかし、タグが適用されていないのに ko.computed でタグが 2 回適用される理由がわかりません。プロジェクトを再選択しない限り、タグは適用されません。