我为Lookups设置WebApi方法,返回
public Object Lookups()
{
var durations = Enum.GetNames(typeof(Duration));
var status = Enum.GetNames(typeof(Status));
return new { durations, status };
}
然后我用breeze
查询服务器 return entityQuery.from('Lookups')
.using(manager).execute()
.then(querySucceeded, _queryFailed);
function querySucceeded(data) {
console.log("Retrieving [Lookups] " + data);
return true;
}
现在稍后我希望从缓存中获取这些查找,请注意,在元数据中,我的Enum位于" EnumType",看起来像breeze尚未提供从服务器端检索枚举的支持所以我返回他们作为一个查找。现在,我想知道如何让他们在当地减少额外往返?
由于
答案 0 :(得分:0)
常规Web API支持.NET Enum。它们的类型名称出现在元数据中,并由Breeze识别。
我认为枚举值不会自动传播到客户端(这样会很好),但您可以通过其他方式将它们发送到客户端,例如您使用查找端点。
Web API OData 也不支持枚举。事实上,如果属性返回枚举,它就会死亡,而WCF数据服务则满足于处理它们的字符串名称。目前我们无法对Web API OData的这个缺陷做些什么。
枚举不是实体,我认为您不想将它们伪造为客户端上的实体。你可以但我不会。
因为它们不是实体,所以Breeze不会将它们存储在缓存中。您的查询返回JavaScript简单对象,而不是实体,并且没有可以找到它们的缓存查询。
我认为在您的情况下我会做的是将这些枚举值捕获为datacontext
服务的数组属性...您正在使用的相同服务(我希望)封装基于Breeze的数据访问活动,以便ViewModels与datacontext
交互,而不是直接与Breeze组件交互。
因此,您的查询查询成功回调可能如下所示:
// Inside the datacontext service
var isReady = null;
var dc = {
ready: ready,
Duration: [],
Status: [],
...
}
return dc;
///////////////
function ready() {
return isReady || (isReady = getReady())); // returns the ready promise
}
function getReady() {
// stuff you do to prime the pump
// returns a promise that is "true" when you've completed your
// preparatory async tasks such as fetching lookups
...
}
...
function lookupsQuerySucceeded(data) {
console.log("Retrieved [Lookups] " + data);
dc.Duration = data.results.Duration;
dc.Status = data.results.Status;
return true;
}
我遗漏了细节,但我希望你明白这一点。
使用这种技术只有一次访问服务器,一次访问以获取初始内容并填充缓存和/或(在本例中)datacontext
本身的属性。
答案 1 :(得分:0)
如果您的元数据(我已加载到变量window.app.metadata中)包含枚举值,那么您可以
<强> 1。编写js代码以在js字典中提取这些枚举
JSON.parse(window.app.metadata).schema.enumType.forEach(function (enumType) {
var newEnumValues = [];
enumType.member.forEach(function (enumValue) {
var newEnumValue = { id: enumValue.value, name: enumValue.name };
newEnumValues.push(newEnumValue);
});
enumDictionary[enumType.name] = newEnumValues;
});
<强> 2。编写一个方法来获取基于枚举名称和id的枚举值。
function GetEnumDictionaryValue(enumName, enumValueId) {
var result = null;
enumDictionary[enumName].some(function (enumValue) {
if (enumValue.id == enumValueId) {
result = enumValue.name;
return;
}
});
return result;
}