3

微风新手 - 我有一个微风实体,它具有一对多关系中的数组导航属性。我想检查父实体是否在导航属性中存在任何相关的子实体。此子数组尚未扩展,我想延迟加载以进行检查。

随着负载异步发生,检查似乎可能不会加载它(如果 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;
}
4

2 回答 2

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 () {
        ...
    });
}
于 2013-06-17T17:49:40.800 回答
2

之所以没有返回您现在想要的内容,是因为您在异步查询完成之前返回了 childrenExist。将函数放入 .then() 将捕获回调,并且仅在检索到数据后才返回它的回调,除非它失败,在这种情况下我们可以返回错误或简单地返回“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);
}
于 2013-06-17T17:43:02.983 回答