创建多个“null”breeze实体并仅查询这些实体

时间:2013-05-06 05:01:49

标签: knockout.js breeze single-page-application

好的,我用另一种方式问了这个问题,还没有看到回应,所以试图简化问题 -

我想创建多个实体,并使用Breeze将它们保留在“已添加”的entityState中。然后我想只返回那些对象并通过导航属性将它们绑定回父对象。

var createEntities = function (parent) {
    manager.createEntity('child', {parentId = parent.id()});
};

然后查询父级并仅返回创建的实体以添加视图 -

var getThoseDamnedEntities = function (parentObservable) {
        var query = EntityQuery.from('Parents')
            .where('id', '==', parentObservable.id())
            .expand('Child');

        return manager.executeQuery(query)
            .then(querySucceeded)
            .fail(queryFailed);

        function querySucceeded(data) {
            if (parentObservable) {
                parentObservable(data.results);
            }
            log('Retrieved [Parent] from remote data source',
                data, true);
        }
};

但是我想通过entityState.Added过滤子结果,这样我只返回尚未保存的新实体,以便在保存之前修改它们。有什么建议吗?

为了阐述这一点 - 我可以直接按类型查询实体(即查询= EntityQuery.from('Child')。where())并使用构造函数来获得一个ko.computed属性。 '只有实体但我仍然无法弄清楚如何查询这些并通过导航属性将它们绑定回父对象(对不起,如果我搞砸那里的术语:))

1 个答案:

答案 0 :(得分:1)

假设我已经理解了你的问题,你实际上有几种方法可以解决这个问题。

首先,您应该只查询entityManager的本地缓存,因为这是"添加"将找到实体。它们尚未保存,(因此仍标记为'已添加')。您可以通过执行上面仅针对本地缓存的查询的反向来执行此操作。(我在这里猜测您的实体类型和属性名称)

var query = EntityQuery.from('Children')
        .where('parent_id', '==', parentObservable.id())
        .using(FetchStrategy.FromLocalCache).then(...)

将返回一个承诺,或者您可以与

同步执行相同的操作
var query = EntityQuery.from('Children')
        .where('parent_id', '==', parentObservable.id()) ;
var localChildren = myEntityManager.executeQueryLocally(query);

这将返回与您的过滤器匹配的本地缓存中的每个实体,因此如果您只想要添加'其中,您需要进一步过滤“本地父母”,即

var addedLocalChildren = localChildren.filter(function(p) {
   return p.entityAspect.entityState.isAdded();
})

另一种可能更简单的方法是基于这样的想法:如果您已经通过外键将父实体链接到子实体,那么entityManager缓存中的任何实体都已经解析了它们的导航属性。这意味着您可以简单地执行:

var children = parentObservable().child;  // 'children' might be a better name for this prop
var addedLocalChildren = children.filter(function(p) {
   return p.entityAspect.entityState.isAdded();
})

希望这是有道理的。