Javascript 何时向Breeze实体添加扩展其他复杂类型

Javascript 何时向Breeze实体添加扩展其他复杂类型,javascript,knockout.js,breeze,single-page-application,durandal,Javascript,Knockout.js,Breeze,Single Page Application,Durandal,我想从数据库中加载一个实体,然后使用它的ICollection(从模型类)加载一些子数据。如果是一对多的关系,那么从单个视图模型执行此操作就足够简单了,但我有一个更复杂的结构- 父母有很多孩子。每个孩子都有很多孙子孙女,这些孙子孙女需要与合适的孩子联系起来。等级制度需要保持得体 到目前为止,我提出的其他选择可能不是最好的方法,所以我的问题是——什么是装载孙子孙女的最佳实践——或者其他方法 在构造函数中配置元数据存储时- function configureMetadataStore(metada

我想从数据库中加载一个实体,然后使用它的ICollection(从模型类)加载一些子数据。如果是一对多的关系,那么从单个视图模型执行此操作就足够简单了,但我有一个更复杂的结构-

父母有很多孩子。每个孩子都有很多孙子孙女,这些孙子孙女需要与合适的孩子联系起来。等级制度需要保持得体

到目前为止,我提出的其他选择可能不是最好的方法,所以我的问题是——什么是装载孙子孙女的最佳实践——或者其他方法

在构造函数中配置元数据存储时-

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;
};

或者其他方法?

如果您的关系不是单向的,那么当您查询它们时,Breeze实体将自动将它们连接在一起。(编辑:从V1.3.5开始,breeze还将连接单向关系。)

这意味着,如果使用查询提取恰好相关的n个实体,所有实体都将以正确的方式自动相互链接。如果使用EntityQuery.expand方法,也会发生同样的情况。因此,您的问题只是如何以最少的调用次数查询图形的任何部分


注意:如果您确实想“漫游”图形,还应该查看EntityAspect.loadNavigationProperty方法。但是,如果您处理的是大型图,那么这可能是无性能的

如果您的关系不是单向的,那么当您查询它们时,Breeze实体将自动将它们连接在一起。(编辑:从V1.3.5开始,breeze还将连接单向关系。)

这意味着,如果使用查询提取恰好相关的n个实体,所有实体都将以正确的方式自动相互链接。如果使用EntityQuery.expand方法,也会发生同样的情况。因此,您的问题只是如何以最少的调用次数查询图形的任何部分


注意:如果您确实想“漫游”图形,还应该查看EntityAspect.loadNavigationProperty方法。但是,如果您处理的是大型图,那么这可能是无性能的

我对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);
在这两种情况下,仅当我删除括号时才起作用,但中间名和姓氏不是必需的,而是空字符串


这是我的错误

我对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);
在这两种情况下,仅当我删除括号时才起作用,但中间名和姓氏不是必需的,而是空字符串


这是我的错误

谢谢,它们不是单向的。您是否介意我更新我的问题以获得更多的指导,或者您是否希望我将此标记为答案并打开一个专门关于查询的新问题?没问题。一个专门关于查询的新问题可能会更好。谢谢,如果你有机会看一看,谢谢,它们不是单向的。您是否介意我更新我的问题以获得更多的指导,或者您是否希望我将此标记为答案并打开一个专门关于查询的新问题?没问题。特别是关于查询的新问题可能会更好。谢谢你这么做了如果你有机会看一看,你可能应该打开一个新问题你可能应该打开一个新问题