假设我有一个Product实体列表。然后我想编辑其中一个产品,所以我打算调用getEntityByKey从缓存中获取它。
然而,在编辑屏幕上,我可能会显示比网格中更多的属性,在我的情况下,我实际上需要对某些Product属性执行expand()。
那么如何处理有关缓存的问题呢?如果我使用getEntityByKey,它不会执行expand()。我可以执行查询,但后来我没有利用缓存的实体(如果我之前已经编辑过产品)。
在这种情况下,我应该选择哪种策略?
答案 0 :(得分:3)
另一种方法:向isReadyForEdit
实体添加Product
标记。如果为false,则使用常规查询来获取完整的Product
WITH EXPAND以获取相关实体。如果确实如此,您知道在缓存中拥有所需的一切,getEntityByKey
就是您所需要的(因为相关实体也将在缓存中)。确保在任何一种情况下都返回一个promise,以便调用者逻辑准备等待。这与John Papa的例子中的isPartial
技术相同。
忘记提及,与John Papa的例子不同,你的isReadyForEdit
不应该是一个未映射的属性,除非你需要序列化它的状态(即使那时我也不太确定)。只需将属性添加到实体中即可。
不是说JP做错了;它适合他的离线场景。但是,如果您不需要支持Breeze的功能,则未映射的属性会增加不必要的复杂性
答案 1 :(得分:1)
我经常使用的一个选项是创建某种类型的导航属性,然后通过调用服务器来实现。这将允许您拉入实体的当前属性,然后当导航属性实现时,它将显示。原油示例 -
在你的JavaScript中某处(假设这里是KO,所以在视图模型中)
var thisPerson = ko.observable();
// Set this person equal to the person returned from a call from cache
thisPerson(datacontext.getPersonById(1));
// Call to the server to get this persons boss
datacontext.getPersonsBoss(thisPerson);
在视图中
<div data-bind="with: thisPerson">
// Bind to properties of this person
<div data-bind="with: boss">
// Bind to the properties of a boss
// which is a navigation property of thisPerson
</div>
</div>
基本上发生的事情是你从缓存中获取此人,然后从服务器获取该人的老板。由于person
具有boss
的导航属性,因此一旦Breeze返回并将其置于缓存中,它将在您的视图中自动生成。
答案 2 :(得分:0)
在上面提出Ward的建议时,我注意到了一件事(对于那些也需要这个解决方案的人,如果你遇到同样的问题)......
运行标准查询时,请记住查询返回的data.results
是一个数组。因此,如果要返回权限本身,则需要从数组中提取它。
即成功
function succeeded(data) {
var result = data.results;
var entity = result[0];
...
return entity;
}