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,尽管我很喜欢。

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

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

4

1 回答 1

1

我认为您有点错过了计算可观察量的意义。计算的可观察对象和常规函数之间唯一真正的区别是,您可以绑定到计算的可观察对象,并依赖它在其组件之一发生更改时自动更新。

计算的 observables的淘汰文档中的示例使用 First/Last name,这是一个很好的示例。

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

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

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

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