阻止 breeze.js 在数组对象上创建可观察属性

Preventing breeze.js from creating observables properties on array objects

我一定是遗漏了一些简单的东西,但无法弄清楚。我正在 1 个 Web API 调用中检索一堆查找 tables。

return EntityQuery.from('Lookups')
       .noTracking(true)
       .using(manager).execute()
       .then(processLookups);

在 processLookups 中,我为返回的每个数组调用 getLocal。示例:状态 table

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

数组是不可观察的,但数组对象中的每个属性都是可观察的函数。这只是我不需要的开销,因为这些不会改变。

如何防止对象属性被观察到?

谢谢

我不确定我是否完全理解这种情况,但 'noTracking' 选项实际上只与 'remote' 查询相关。即不是本地的。基本上,'noTracking' 告诉 breeze 不要将查询结果处理成 breeze 实体,也不要缓存这些结果。

当您查询缓存时,这就是 'executeQueryLocally' 正在做的事情,这两个步骤都已经发生,所以 'noTracking' 被忽略了。

您可以在查询的成功回调中使用原始查找。没有理由查看缓存......即使它们在那里(它们并不像 Jay 所说的那样)。

但是你会用这些查找做什么?大概您希望它们与真实实体相关(通过 Breeze 导航路径)。例如,您想要 session.room 到 return 相关的房间对象。但是,如果房间是您的查找对象之一并且不是实体,那么 session.room 导航 属性 不会 return 它;导航属性总是 return 个实体。

我可以想办法解决这个问题。但这只是更多的工作和更多的诡计。

让我们停下来问最重要的问题:为什么?

为什么要关心查找是否是具有可观察属性的实体?它可能是“你不需要的开销”。但是 开销会伤害到您 吗?疼你怎么办?你量过吗?

请原谅我,但我感觉到过早的优化可能会分散您对更有价值的追求的注意力。很高兴被证明是错误的。