【发布时间】:2018-04-15 17:56:11
【问题描述】:
我来自 Knockout.js 背景,我一直在考虑为我未来的项目尝试 Vue.js。让我感到困惑的一件事是在嵌套数据数组上使用计算函数。
假设我们从 ajax 调用“/api/getProject/”中获取此数据结构。
{
projectID: 23,
phases: [
{
phaseID: 23,
activities: [
{activityID : 23, start: "date", end : "date"},
{activityID : 23, start: "date", end : "date"}
]
},
{
phaseID: 24,
activities: [
{activityID : 23, start: "date", end : "date"},
{activityID : 23, start: "date", end : "date"}
]
},
]
}
为此,我需要一些计算变量。首先,将是每个活动的持续时间。然后,我想要计算每个阶段的总持续时间。最后是项目总工期的计算结果。
使用 KO.js,我这样做的方式是为每个数据点创建类并将计算函数放入每个类中。例如。
var Project = function(obj){
var self = this;
self.projectID = ko.observable(obj.projectID);
var mapped = mapArray(obj.phases, i => new Phase(i));
self.phases = ko.observableArray(mapped);
self.computed = {
total : ko.computed(() => {
var total = 0;
for(var phase of self.phases())
total += phase.computed.total();
return total;
}),
}
}
var Phase = function(obj){
var self = this;
self.phaseID = ko.observable(obj.phaseID);
var mapped = mapArray(obj.activities, i => new Activity(i));
self.activities = ko.observableArray(mapped);
self.computed = {
total : ko.computed(() => {
var total = 0;
for(var act of self.activities())
total += act.computed.duration();
return total;
}),
}
}
var Activity = function(obj){
var self = this;
self.activityID = ko.observable(obj.activityID);
self.start = ko.observable(obj.start);
self.end = ko.observable(obj.end);
self.computed= {
duration: ko.computed(() => {
return end - start;
}),
}
}
然后做。
$.getJSON("/api/getProject", function (data, status, xhr) {
VM.project = new Project(data);
}),
以下是我阅读和考虑的一些内容,以及为什么我无法让它们发挥作用。
“使用组件项目、阶段、活动,每个组件都有自己的计算属性”-据我了解,组件无法从其他组件读取数据,而且我的数据都是一次调用,所以我将如何设置数据每个组件?大多数答案只是用硬编码值填充数据,而大多数情况下并非如此。
感谢任何帮助。我知道我可能以错误的方式看待这个问题,所以如果我可以改变我的数据传递方式或我对 Vue.js 的看法;我愿意这样做。
【问题讨论】:
-
Knockout 没有 Vue 所拥有的——通过 Vuex 进行状态管理。这就是您以集中方式保存数据的地方,以便您的各种组件可以访问它。 vuex.vuejs.org/en/intro.html
标签: knockout.js vue.js