在我的淘汰应用程序中,我有两个可观察的数组。一个是位置,
self.locations = ko.observableArray([]).withIndex('id');
这包含所有位置。这些位置可以与项目相关联。如果项目中不存在位置,则项目标识为null。
另一个数组是项目。它包含所有项目,如果它们有任何位置,它有一系列位置。
现在我要做的是获得一个包含两个像
这样的组合的数组displayLocations = {
location1 = {name = "abc", ...}
... these don't have any projects
location9 = {name = "xyz", projectName = "project1", .. }
}
我正在尝试为其创建一个计算属性,然后在视图方面,我正在考虑使用不同的模板,具体取决于该位置是否具有项目。
有什么建议吗?
答案 0 :(得分:2)
不确定withIndex
方法,但使用vanilla KO,您可以在ko.utils.arrayMap
内使用computed
:
this.associatedLocations = ko.computed(function() {
var dataLoc = this.locations(),
dataProj = this.projects(),
result = ko.utils.arrayMap(dataLoc, function(loc) {
var newObj = loc, project;
if (loc.projectId !== null) {
project = ko.utils.arrayFirst(dataProj, function(proj) {
return proj.id === loc.projectId;
});
newObj.projectData = proj;
}
return newObj;
});
return result;
}, this);
// assumes locations have a 'projectId' & 'name' property, & projects an 'id' property
// will return an array in the form of
// [ {name: 'xyz', projectData: { id: ..., projectName: ...}}]
您可以通过执行以下操作来测试某个位置是否与项目相关联:
<div data-bind="template: {
name: obj.projectData ? 'nameIfProject' : 'nameIfNoProject' }">
</div>