2014-01-16 2 views
1

Интересно, есть ли простой способ для реализации адаптера модели cutom modelLibrary, аналогичный адаптеру native backingStore.Breezejs настроить backingStore адаптер

В принципе, я использую адаптер backingStore, так как я не хочу, чтобы мои свойства были ko наблюдаемыми. Однако я хочу добавить дополнительную настройку; Я хотел бы, чтобы значения даты были указаны в момент времени jS.

Мне просто интересно, есть ли какие-либо точки расширения в адаптере native backingStore или если есть какой-либо другой более простой способ выполнить эту задачу.

+0

я могу исправить это путем изменения исходного кода breezeJS; Но это не идеальное решение. – ppoliani

+0

В документации API мало намеков на то, как создать свой собственный, если вы знаете, где искать. Я считаю, что ключ использует getProperty и setProperty прототипа сущностей и определяет, как «перехватывать» значения, но, вероятно, гораздо сложнее. +1 для внимания. –

ответ

0

Это хороший вопрос, но, к сожалению, мы не документировали многое в этой области. Тем не менее, у нас есть 3 адаптера modelLibrary, которые вы просматриваете для источника уже на ветру («backingStore», «ko» и «backbone»), а Breeze сконструирован так, чтобы адаптеры были подключаемыми.

Исходными файлами на GitHub являются «b000_breeze.modelLibrary.xxx», где xxx - это имя адаптера.

Таким образом, мое предложение было бы создать собственный адаптер backingStoreMoment в качестве копии «backingStoreAdapter». Взгляните на метод «startTracking». Этот метод выполняет итерацию по каждому свойству каждого объекта один раз до того, как объект сначала «создан». Поскольку у вас есть доступ к метаданным для каждого «dataProperty» из этого метода, я думаю, что довольно просто перенести любые свойства DateTime или DateTimeOffset в качестве значений MomentJs.

Пожалуйста, верните назад свой прогресс, и, возможно, мы сможем добавить вашу работу в качестве еще одного адаптера бриза.

+0

Я отправил ответ с некоторыми идеями по этому вопросу – ppoliani

1

придумали несколько решений:

1) Измените метод SetProperty

Первый раствор придумал было изменить метод SetProperty; Поэтому в основном я проверяю, является ли входящее значение экземпляром Date, и в этом случае я превращаю его в экземпляр момента.

proto.setProperty = function (propertyName, value) { 
     //if (!this._backingStore.hasOwnProperty(propertyName)) { 
     // throw new Error("Unknown property name:" + propertyName); 
     //} 
     var val = value instanceof Date ? moment(value) : value; 
     this[propertyName] = val; 
     // allow setProperty chaining. 
     return this; 
    }; 

Мне не понравилось это решение по нескольким причинам. Прежде всего, дополнительная проверка выполняется каждый раз, когда устанавливается значение свойства; кроме того, мы можем передать экземпляр строки как значение свойства date, и в этом случае нам нужно добавить дополнительную логику для определения типа значения. Наконец, мы можем захотеть добавить ту же логику к другим адаптерам, так что мы закончим тем, что будем повторяться.

2) Переопределение метода DataType.parseDateFromServer

Второе решение должно было передать пользовательскую реализацию метода DataType.parseDateFromServer. То есть, в функции которой прилагает несколько конфигураций ветер, я добавил следующие строки кодов:

function parseDateAsMoment(source) { 
    return moment(source); 
} 

breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);  
breeze.DataType.parseDateFromServer = parseDateAsMoment; 

3) Импорт propertyFormatters

Этого решение, которое я закончил пользуюсь. По сути, я расширил DataType с помощью метода registerPropFormatter.

DataType.registerPropFormatter = function(dataType, formatter) { 
    switch (dataType) { 
     case DataType.DateTime: 
      DataType.parseDateFromServer = formatter; 
      break; 
     case DataType.DateTimeOffset: 
      DataType.parseTimeFromServer = formatter; 
      break; 
     default: 
    } 
}, 

В принципе, то, что этот метод не является, это позволяет нам импортировать пользовательский форматировщик для любого типа поддерживаемых типов данных.

Затем, во время инициализации ветер, я могу просто зарегистрировать мою собственность форматтеры:

function parseDateAsMoment(source) { 
    return moment(source); 
} 

breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true); 
breeze.DataType.registerPropFormatter(breeze.DataType.DateTime, parseDateAsMoment); 
Смежные вопросы