Breeze为每个odata查询询问元数据

时间:2014-04-12 03:10:44

标签: angularjs odata breeze

当我使用带有三个选择查询的新的breeze角度服务运行一个简单的Angular页面时,我看到微风正在请求三个元数据副本。有没有办法可以减少两个额外的元数据调用?

我创建一个EntityManager实例,然后发出三个查询。

var entityManager = entityManagerFactory.newManager();

    var query = breeze.EntityQuery
      .from("Customers")
      .expand("Orders")
      .orderBy('FName, LName');

    getSet(query, 'my.customers');

    query = breeze.EntityQuery
      .from("Items")
      .orderBy('ItemID');

    getSet(query, 'my.items');

    query = breeze.EntityQuery
      .from("Orders")
      .expand("Details")
      .orderBy('DropDate');

    getSet(query, 'my.orders');

    function getSet(query,setName) {
      entityManager.executeQuery(query)
      .then(function (data) {
        var model = $parse(setName);
        model.assign($scope, data.results);
      })
      .catch(failed)
      .finally(refreshView);
    }

当我跟踪Fiddler时,我看到首先返回三个元数据,然后是三个查询。

EDIT ---------------------------------------------- ----------------

在查询解决问题之前预取元数据。现在,只有一个请求。

function getMetadata(manager) {
      manager.fetchMetadata()
        .then(getSets);
}

1 个答案:

答案 0 :(得分:3)

我猜,你连续三次获取元数据因为你同时启动了三个查询而没有等待第一次完成。

breeze中的第一个查询(或直接元数据获取)加载EntityManager的元数据。任何后续查询都不会获取元数据。

我认为,您正在做的是在第一次返回元数据之前要求breeze执行多个查询。因为每个查询都在检查尚未从服务器返回的元数据,所以每个查询都提交它自己的元数据获取请求。因此,有三个元数据获取请求。

您可以通过预取元数据,通过EntityManager.fetchMetadata或提交第一个查询来避免这种情况,然后您需要推迟任何其他查询,直到解决了返回的承诺