我想从数据库加载一个实体,然后使用它的ICollection(来自模型类)加载一些子数据。如果它是1对多的关系,这对于单个视图模型来说很简单,但是我的结构有点复杂 -
父母有很多孩子。每个孩子都有许多孙子女,需要与适当的孩子联系起来。层次结构需要保持原状。
到目前为止我提出的其他选项可能不是最好的方式,所以我的问题是 - 加载孙子的最佳做法是什么 - 或者其他一些方法?
配置metadataStore时在构造函数中-
function configureMetadataStore(metadataStore) {
metadataStore.registerEntityTypeCtor(
'Child', null, childInitializer);
}
function childInitializer(child) {
child.grandchildren = (Do something here)
return grandchildren;
});
}
在正在填充子项的viewmodel中 -
function refresh() {
return datacontext.getChildren(childs, parentId);
}
var addGrandChildren = function () {
$.each(childs, function (i) {
var grandChildren = ko.observableArray();
var childId = $(this).data(id);
datacontext.getGrandChildren(grandChildren, childId);
});
return;
};
还是其他一些方法?
答案 0 :(得分:1)
假设您的关系不是单向的,Breeze实体会在您查询它们时自动将它们连接在一起。 (编辑:从v 1.3.5开始 - breeze也将连接单向关系。)
这意味着如果您使用查询提取恰好相关的n个实体,则所有实体都将以正确的方式自动链接到彼此。如果使用EntityQuery.expand方法,也会出现同样的情况。所以你的问题就是如何在最少的调用次数中查询你想要的图形的任何部分。
注意:如果您真的想要“走”图形,还应该查看EntityAspect.loadNavigationProperty方法。但是如果你正在处理大型图形,这可能是不具备性能的。
答案 1 :(得分:0)
我和Breezejs(1.4.2)q(0.9.7)有同样的问题 我想为实体添加计算属性。
var doctorInitializer = function (doctor) {
doctor.FullName = ko.computed(function () {
return doctor.FirstName() + " " + doctor.MiddleName() + " " + doctor.LastName() + " " + doctor.SurName();
});
};
var doctorName = '/breeze/polyclinic',
doctorManager = new breeze.EntityManager(doctorName);
var store = doctorManager.metadataStore;
store.registerEntityTypeCtor("Doctor", null, doctorInitializer);
我尝试将敲除计算器添加到构造函数
var doctor = function () {
self.FullName = ko.computed( {
read: function() {
return self.FirstName + " " + self.MiddleName + " " + self.LastName + " " + self.SurName;
},
deferEvaluation: true
});
};
store.registerEntityTypeCtor("Doctor", doctorInitializer);
在这两种情况下只有在我删除括号但但不需要MiddleName和SurName而不是空字符串时我才能使用
的错误