0

データが 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 回適用される理由がわかりません。プロジェクトを再選択しない限り、タグは適用されません。

4

1 に答える 1

1

計算されたオブザーバブルの要点を見逃していると思います。計算されたオブザーバブルと通常の関数の唯一の実際の違いは、計算されたオブザーバブルにバインドし、そのコンポーネントのいずれかが変更されたときにいつでも自動更新できることです。

計算されたオブザーバブルのノックアウト ドキュメントの例では、名/姓を使用しています。これは良い例です。

これに基づいて、計算されたもの自体の中で計算されたものの依存関係を更新することは本当に良い考えではありません。以前のバージョンのノックアウトでは、これにより実際に無限循環参照が作成されていました。

タグとタスクの両方が更新をトリガーしている新しいデータを受信して​​いるため、計算されたものは2回実行されていると思います(ただし、ノックアウトに組み込まれたセーフガードのため、更新は1回だけです)。

より良いオプションは、SelectedProject を購読することです。その後、観測可能な変更が発生するたびに、すべてのアレイを再ラックできます。

self.SelectedProject.subscribe(function(newValue) {
    <load your arrays here>
});
于 2013-10-01T15:15:56.573 に答える