Я настраиваю метод 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». Похоже, что ветерок еще не поддерживает получение перечислений со стороны сервера, поэтому я возвращаю их как поисковые запросы. Теперь мне интересно, как я могу получить их на месте, чтобы сократить дополнительные поездки туда и обратно?

Благодарность

0
Ammar Khan 1 Июн 2014 в 15:17
Что вы подразумеваете под "получить их локально"? Вы имеете в виду запросить их из кеша или вы имеете в виду определить их в кеше без предварительного извлечения с сервера с помощью вашего запроса Lookups?
 – 
Ward
1 Июн 2014 в 20:42
Да, я хочу получить их из кеша после получения сначала с сервера при запуске приложения. Они не являются сущностями, поэтому я не могу получить их через entityQuery.from('Duration').. потому что не существует имени ресурса. Итак, как мне получить их из кеша?
 – 
Ammar Khan
1 Июн 2014 в 20:50
Кроме того, есть ли какой-либо план, согласно которому ветерок будет поддерживать получение Enums на стороне клиента, чтобы заполнить выпадающий список или некоторые другие интересные вещи вместо того, чтобы возвращать их в виде поиска? Хотя они присутствуют в метаданных, но не существует метода, позволяющего получить их что-то вроде entityQuery.getEnumType('Duration')..
 – 
Ammar Khan
1 Июн 2014 в 23:19

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.

0
Ward 3 Июн 2014 в 02:15
Большое спасибо за отличное объяснение и предложение. Итак, каково ваше мнение, сэр, я выбираю правильный путь для получения перечислений с сервера в качестве поиска? Как вы можете видеть, я возвращаю только Enum Names, будет ли ветер автоматически заполнять их связанное значение обратно на сервере, когда я вызываю сохранение изменений в Entity? Кроме того, не думаете ли вы, что было бы здорово, если бы в EntityQuery был метод для заполнения Enums на клиенте, когда он у нас есть в метаданных, который больше не требуется для вызова сервера? Может быть, я ошибаюсь, но это то, что я думаю, пожалуйста, выскажите свое предложение. Спасибо
 – 
Ammar Khan
3 Июн 2014 в 05:27
Да Breeze правильно обрабатывает имена перечислений как значения, если сервер представляет собой веб-API (не OData веб-API). Breeze отправляет имя строки обратно, и привязка модели веб-API превращает его в значение перечисления. Да, значения перечисления доступны в метаданных, сгенерированных EF и отправленных клиенту Breeze. Я согласен, что Breeze должен автоматически подобрать их и поместить куда-нибудь, чтобы вам не приходилось делать для них отдельный запрос или извлекать их из необработанных метаданных, переданных в MetadataStore.fetchMetadataуспешный обратный вызов. Он у нас в резерве. Между тем, вам придется получить их вручную.
 – 
Ward
3 Июн 2014 в 10:16
1
Если вам интересно, как получить значения перечисления из необработанных метаданных, возвращаемых MetadataStore.fetchMetadata, см. DocCode metadataTests.js
 – 
Ward
3 Июн 2014 в 10:41
Большое спасибо. Это действительно полезно.
 – 
Ammar Khan
3 Июн 2014 в 19:26
Сэр, мне нужна ваша быстрая помощь, связанная с подобным. Теперь у меня есть массив продолжительности, как вы предложили, в основном объект массива javascript, который содержит свойства «enumName» и «enumDisplayName» для лучшего взаимодействия с пользователем. Проблема в том, как я могу создать объект nullo в этом случае. Если бы это была сущность, которую я мог бы легко создать, используя параметр начальных значений Breeze create Entity. Но как бы я творил в этом случае. не могли бы вы предложить? Спасибо
 – 
Ammar Khan
17 Июн 2014 в 15:47

Если ваши метаданные (я загрузил их в переменную 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;
    }
0
Risky Pathak 22 Май 2015 в 20:53