Я настраиваю метод WebApi для поиска, который возвращает
public Object Lookups()
{
var durations = Enum.GetNames(typeof(Duration));
var status = Enum.GetNames(typeof(Status));
return new { durations, status };
}
Затем я делаю запрос к серверу с легкостью
return entityQuery.from('Lookups')
.using(manager).execute()
.then(querySucceeded, _queryFailed);
function querySucceeded(data) {
console.log("Retrieving [Lookups] " + data);
return true;
}
Позже я хочу получить эти поисковые запросы из кеша, обратите внимание, что в метаданных мои перечисления находятся в разделе «EnumType». Похоже, что ветерок еще не поддерживает получение перечислений со стороны сервера, поэтому я возвращаю их как поисковые запросы. Теперь мне интересно, как я могу получить их на месте, чтобы сократить дополнительные поездки туда и обратно?
Благодарность
2 ответа
.NET Enums поддерживаются обычным веб-API. Их имена типов появляются в метаданных и распознаются Breeze.
Я не думаю, что значения перечисления распространяются на клиент автоматически (это было бы неплохо), но вы можете отправить их клиенту другими способами, например, с конечной точкой поиска.
Веб-API OData также пока не поддерживает перечисления. Фактически, он умирает, если свойство возвращает перечисление, тогда как службы данных WCF обрабатывают свои строковые имена. На данный момент мы ничего не можем поделать с этим недостатком OData веб-API.
Перечисления не являются сущностями, и я не думаю, что вы хотите имитировать их как сущности на клиенте. Вы могли бы, но я не стал бы.
Поскольку они не являются сущностями, 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
.
MetadataStore.fetchMetadata
успешный обратный вызов. Он у нас в резерве. Между тем, вам придется получить их вручную.
MetadataStore.fetchMetadata
, см. DocCode metadataTests.js
Если ваши метаданные (я загрузил их в переменную 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. Напишите метод получения значения перечисления на основе имени и идентификатора перечисления.
function GetEnumDictionaryValue(enumName, enumValueId) {
var result = null;
enumDictionary[enumName].some(function (enumValue) {
if (enumValue.id == enumValueId) {
result = enumValue.name;
return;
}
});
return result;
}
Похожие вопросы
Связанные вопросы
Новые вопросы
enums
Тип данных, состоящий из набора именованных значений, называемых элементами, членами или перечислителями типа.
Lookups
?