Ko.计算函数更新两次

Ko.computed function updates twice

本文关键字:两次 计算 函数 更新 Ko      更新时间:2023-09-26

由于数据是通过AJAX加载的,我需要在数据到达时更新数据。

在页面加载时,我在数据库中收集项目。然后根据选择的项目(self.选定项目(。

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/作为跟踪代码管理器,它只需要一个带有 TagName 的数组。因此,尽管我想要那样,但我还没有弄清楚如何直接使用 Tags((-数组。

任务

以手风琴形式呈现,我希望在内容面板中应用任务标签,同时使用我的项目标签作为自动完成功能的标签源...

但是我无法弄清楚为什么我的标签使用 ko.computed 应用 2 次,而没有应用它们,除非我重新选择没有它的项目。

我认为

你有点错过了计算可观察量的重点。计算可观察量和常规函数之间唯一真正的区别是,您可以绑定到计算的可观察量,并依靠它在其组件之一更改时自动更新。

计算可观察量的淘汰文档中的示例使用名字/姓氏,这是一个很好的示例。

基于此,在计算本身中更新计算的依赖项确实不是一个好主意。在早期版本的淘汰赛中,这实际上会创建一个无限循环引用。

我假设计算运行两次,因为标签和任务都在接收新数据,这会触发更新(但由于挖空内置的保护措施,只有一次更新(。

更好的选择是订阅SelectedProject。然后,每次可观察到的更改时,您都可以重新架上所有阵列。

self.SelectedProject.subscribe(function(newValue) {
    <load your arrays here>
});