Breeze - Lazy Load Navigation Property

时间:2013-06-17 15:08:51

标签: javascript entity-framework breeze

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

2 个答案:

答案 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);
}