我必须遗漏一些简单的东西,但无法弄清楚。我在1个Web API调用中检索了一堆查找表。
return EntityQuery.from('Lookups')
.noTracking(true)
.using(manager).execute()
.then(processLookups);
在processLookups中,我为每个返回的数组调用getLocal。示例:状态表
datacontext.lookups = {
state: getLocal('States', orderBy.state, true),
....
}
function getLocal(resource, ordering, includeNullos) {
var query = EntityQuery.from(resource)
.orderBy(ordering)
.noTracking(true);
if (!includeNullos) {
query = query.where('id', '!=', 0);
}
return manager.executeQueryLocally(query);
}
数组不可观察,但数组对象中的每个属性都是可观察的函数。这只是我不需要的开销,因为这些不会改变。
如何防止对象属性被观察?
由于
答案 0 :(得分:1)
我不确定我是否完全理解这种情况,但是' noTracking'选项实际上只与' remote'相关。查询。即不是本地的。基本上,' noTracking'告诉breeze不会将查询结果处理成breeze实体,也不会缓存这些结果。
当你查询缓存时,这是什么' executeQueryLocally'正在做,这两个步骤都已经发生,所以' noTracking'被忽略了。
答案 1 :(得分:1)
在查询成功回调中,您可以使用原始查找。没有理由看缓存...即使他们在那里(他们不是杰伊明确表示)。
但是你会对这些查找做些什么?据推测,您希望它们(通过Breeze导航路径)与真实实体相关联。例如,您希望session.room
返回相关的房间对象。但是如果房间是您的查找之一并且不是实体,那么session.room
导航属性将不会返回它;导航属性始终返回实体。
我可以想办法解决这个问题。但这只是更多的工作和更多的诡计。
让我们暂停一下并提出最重要的问题:为什么?
为什么关心查找是否具有可观察属性的实体?它可能是“开销,你不需要”。但是开销会伤害你吗?伤害你怎么样?你有没有测量过它?
请原谅我,但我感觉到过早的优化可能会让你分心,从更有价值的追求中分散你的注意力。很高兴被证明是错误的。