Breeze的新手 - 我有一个轻松的实体,它具有一对多关系中的数组导航属性。我想检查父实体是否在导航属性中存在任何相关的子实体。这个子数组还没有扩展,我想懒得加载检查。
负载异步发生时,检查可能无法加载 (如果entity.children()...)。 如果我把检查放在“then”回调中,似乎我会遇到同样的问题。有没有办法同步加载子数组,以便我可以检查并返回是否填充?或者有更好的方法吗?
function doChildrenExist (entity) {
var childrenExist = false;
entity.entityAspect.loadNavigationProperty("children")
.then(function () {})
.fail(function () {});
if(entity.children() !== null || entity.children().length > 0) {
childrenExist = true;
}
return childrenExist;
}
答案 0 :(得分:3)
没有办法同步加载导航属性(这是ajax的本质),但是你在loadNavigationProperty的正确轨道上。您可以执行以下操作,传递一个回调函数,该函数将根据子项是否存在而以“true”或“false”调用。
function doChildrenExist(entity, callback) {
entity.entityAspect.loadNavigationProperty("children").then(function () {
// this syntax assumes knockout model library.
var childrenExist = entity.children().length > 0;
callback(childrenExist);
}).fail(function () {
...
});
}
答案 1 :(得分:2)
之所以没有返回您现在想要的是因为您在异步查询完成之前返回了childrenExist。将函数放在.then()中将捕获回调,并且只有在检索到数据后才返回IT'S回调,除非它失败,在这种情况下我们可以返回错误或只是'false'。
function doChildrenExist (entity) {
var childrenExist = false;
entity.entityAspect.loadNavigationProperty("children")
.then(function () {
if(entity.children().length > 0) {
childrenExist = true;
}
return childrenExist; })
.fail(catchError);
function catchError(e) {
alert(e.message);
return false;
}
}
要保存几个字节的代码,你也应该能够做到这一点 -
function doChildrenExist (entity) {
// No need to define a variable since we are either returning true or false
entity.entityAspect.loadNavigationProperty("children")
.then(function () {
if(entity.children().length > 0) {
return true;
}
return false; })
.fail(catchError);
function catchError(e) {
alert(e.message);
return false;
}
}
并且在您的函数中调用doChildrenExist -
var showChildren = ko.observable(false); // Do something like hide children until they exist
function refresh(entity) {
doChildrenExist(entity)
.then(checkResult)
}
function checkResult(result) {
showChildren(result);
}