Ko.计算函数更新两次
Ko.computed function updates twice
由于数据是通过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>
});
相关文章:
- Meteor Router数据函数被调用两次
- 从MySQL数据库中获取输入数据需要两次页面刷新
- Module.start()已激发两次
- Jquery点击事件必须点击两次
- Append元素在运行两次函数后不显示
- 防止双击执行两次jQuery post请求
- 我必须点击两次才能激活任何按钮操作(离子/角度)
- 单击jQuery会激发两次
- 如何避免在树上走两次
- 计算两次的差值
- Angular JS:使用ng重复计算每行两次之间的差
- 函数计算两次折扣
- Ko.计算函数更新两次
- 我怎样才能计算两次之间的差值
- 用分钟计算两次约会的差异
- 使用jQuery和javascript计算两次之间的差异,并以分钟为单位返回
- 如何计算两次之间的工作时间
- 如何计算两次按键之间的时间间隔事件
- 计算两次约会之间有多少工作日和周末
- 我如何用分钟计算两次约会的时间差