2014-09-03 55 views
0

我是新来的微风,这看起来像一个错误,但认为我会问在这里,如果我只是不明白。执行与加载的元数据本地查询失败

安装加载元数据:

var metadataStore = new breeze.MetadataStore(); 
metadataStore.importMetadata(metadata); 

queryOptions = new breeze.QueryOptions({ 
    fetchStrategy: breeze.FetchStrategy.FromLocalCache 
}); 

mgr = new breeze.EntityManager({ 
    serviceName: 'breeze', 
    metadataStore: metadataStore, 
    queryOptions: queryOptions 
}); 

执行本地查询工作明确:

var q = breeze.EntityQuery.from("Boards") 
      .toType('Board') 
      .where('isImplicit', 'equals', withImplicits) 
      .orderBy('name'); 

return manager.executeQueryLocally(q) // returns result 

但使用query.using并不:

var q = breeze.EntityQuery.from("Boards") 
    .toType('Board') 
    .where('isImplicit', 'equals', withImplicits) 
    .orderBy('name'); 

q = q.using(breeze.FetchStrategy.FromLocalCache) 

return manager.executeQuery(q) 

UPDATE:澄清,上述抛出一个错误,因为它尝试fetchMetdata并且存在没有端点可以从中提取。如果我猴子补丁下面的代码,它工作正常。这似乎是如果dataService .hasServerMetadata,你不需要获取它。我创建了一个微风适配器测试工具,所以我希望能够在不后端

貌似问题是在this line EntityManager的运行:

if ((!dataService.hasServerMetadata) || this.metadataStore.hasMetadataFor(dataService.serviceName)) { 
     promise = executeQueryCore(this, query, queryOptions, dataService); 
    } else { 
     var that = this; 
     promise = this.fetchMetadata(dataService).then(function() { 
      return executeQueryCore(that, query, queryOptions, dataService); 
     }); 
    } 

我相信行应if(dataService.hasServerMetadata || ...,但对Breeze来说,新的想法在开启GH问题之前我会问到这里。

回答

0

EntityManager.executeQueryLocally是一个同步函数,您可以立即使用它的结果。即

var myEntities = myEntityManager.executeQueryLocally(myQuery); 

鉴于EntityManager.executeQuery是asynchonous函数(即使查询具有“使用”调用,指定这是一个本地查询)。所以,你需要调用它像这样:

var q2 = myQuery.using(breeze.FetchStrategy.FromLocalCache); 
myEntityManager.executeQuery(q2).then(function(data) { 
    var myEntities = data.results; 
}); 

这背后的想法是,用的executeQuery你把所有的疑问在完全相同的方式,即异步,不管他们是否是引擎盖下实际上是异步的。

如果你想创建一个EntityManager不会去服务器进行元数据,你可以做到以下几点:

var ds = new breeze.DataService({ 
    serviceName: "none", 
    hasServerMetadata: false 
}); 

var manager = new breeze.EntityManager({ 
    dataService: ds 
}); 
+0

是的,我理解上的差异,我想正是使用第二格式的原因你指定。我只想确认这是一个错误,它在手动使用元数据加载并且纯粹运行本地时不起作用。 – martypdx 2014-09-03 22:37:43

+0

对不起,我必须错过一些东西......我不明白你认为这个错误是什么。 'return manager.executeQuery(q)'将总是返回一个Promise而不是实际的实体。你看到什么错误? – 2014-09-03 22:42:33

+0

对不起,周杰伦,增加了一些细节。基本上我创建了一个测试工具并希望在没有服务器的情况下运行。 – martypdx 2014-09-03 23:29:01