防止breeze.js在数组对象上创建observables属性

时间:2015-02-18 21:30:54

标签: properties breeze observable

我必须遗漏一些简单的东西,但无法弄清楚。我在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);
}

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

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

由于

2 个答案:

答案 0 :(得分:1)

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

当你查询缓存时,这是什么' executeQueryLocally'正在做,这两个步骤都已经发生,所以' noTracking'被忽略了。

答案 1 :(得分:1)

在查询成功回调中,您可以使用原始查找。没有理由看缓存...即使他们在那里(他们不是杰伊明确表示)。

但是你会对这些查找做些什么?据推测,您希望它们(通过Breeze导航路径)与真实实体相关联。例如,您希望session.room返回相关的房间对象。但是如果房间是您的查找之一并且不是实体,那么session.room导航属性将不会返回它;导航属性始终返回实体。

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

让我们暂停一下并提出最重要的问题:为什么?

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

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