2015-02-10 2 views
1

Поскольку мне нужно получить доступ к месяцу, дню и году на моей странице, у меня есть модель с составным объектом SplitDate.Отображение нокаутов - не хотите создавать объекты, но их необходимо сериализовать

var SplitDate = function(date) { 
     var _date = ko.observable(); // the backing field 

     this.date = ko.computed({ read: _date, write: setDate }); 
     this.year = ko.computed({ read: makeGetter('year'), write: makeSetter('year') }); 
     this.month = ko.computed({ read: getMonth, write: setMonth }); 
     this.day = ko.computed({ read: makeGetter('date'), write: makeSetter('date') 

     // not showing setters/getters, etc. 
     .... 
    }); 
} 

На мой взгляд модель, я использую этот объект следующим образом;

self.trainingEndDate = ko.observable(new SplitDate()); 

Проблема у меня в том, что мне нужно, чтобы иметь возможность сопоставить новые данные из вызова Ajax несколько раз для одной и той же страницы. Я попытался разрешить Knockout Mapping создавать новый SplitDate каждый раз, но это не сработало. По-видимому, SplitDate, который был сброшен и заменен, был тем, который был привязан к странице.

Поэтому я создал сопоставление, которое игнорировало бы представления viewmodel, которые были SplitDates, а для тех, которые я просто обновляю дату существующего элемента управления.

Это работало нормально, пока мне не пришлось развернуть модель и опубликовать ее с помощью вызова ajax. Отображение нокаутов устанавливает флаг в свойствах игнорирования, поэтому они не включаются в неотобранный объект. Я использую разные параметры сопоставления, которые не «игнорируют» их, и я также попытался добавить их в опцию «включить», но это не сработало.

Почему нет явного «включения» в соответствие с неявным «игнорированием»? Должен ли я игнорировать эти объекты на карте? есть ли опция, которую я могу использовать для вызова установщика даты вместо того, чтобы игнорировать их?

Что-то впереди, но есть ли что-то, что мне нужно включить в SplitDate, чтобы убедиться, что оно правильно сериализовано после того, как я получил сопоставление, чтобы включить его?

+0

Не могли бы вы включить код, который фактически выполняет сопоставление/сериализация/десериализация? – janfoeh

ответ

0

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

var CreateSplitDate = function(date) { 
    var _date = ko.observable(); // the backing field 

    _date.date = ko.computed({ read: _date, write: setDate }); 
    _date.year = ko.computed({ read: makeGetter('year'), write: makeSetter('year') }); 
    _date.month = ko.computed({ read: getMonth, write: setMonth }); 
    _date.day = ko.computed({ read: makeGetter('date'), write: makeSetter('date') 

    // not showing setters/getters, etc. 
    .... 

    return _date; 
}; 

Затем просто использовать:

self.trainingEndDate = ko.observable(CreateSplitDate()); 

Это позволит лечить вычисленные наблюдаемым почти так же, как вы бы использовать существующий подход. Однако, когда вы вызываете ko.mapping.toJS, участники, которых вы подключили к trainingEndDate, будут проигнорированы.

Вот простой пример такого поведения: http://jsfiddle.net/c46gknfj/

Надеется, что это помогает!

+0

Итак, хотя мне понравился ваш код лучше, чем то, что у меня было, это действительно не помогло с отображением нокаута. Если я игнорировал свойства при сопоставлении, включая их, когда unmapping все еще не работал. И если я НЕ проигнорировал их, то картограф все еще бросал объект и создавал новый. Возможно, это было что-то, что я сделал неправильно, применив ваш код, но я время хрустел и больше не могу играть с ним. Я закончил игнорировать свойства на карте, а затем вручную их кодировал при размножении. –

+0

@SteveWash - Не могли бы вы опубликовать пример jsfiddle того, что вы сделали? –

+0

Я постараюсь получить это, но невероятно хрустел. Tech lead quit и я замена defacto. –

0

У меня были схожие проблемы, пытаясь заменить экземпляр объекта новым. Я предполагаю, что привязки КО теряются, когда это делается. Однако, из вашего сценария, мне кажется, что назначение состоит из:

Раскладывая дату лица в дни, месяцы и годы, не загрязняя основной ViewModel с этими отдельными лицами при отправке на сервер.

Наиболее логичное решение, которое приходит на ум, а затем (и который обрабатывает данные вне вашей виртуальной машины, а не как ребенка свойство) является компонента (который позволит избежать проблем отображения в целом) ,Вы передаете одно свойство как данные, а компонент обрабатывает и визуализирует его в своем собственном, не отображаемом viewModel. Например, допустим, что только данные, которые вы извлекаете и сохраняете, представляют собой строку в формате DD/MM/YYYY. Это ваш очень минимален VM:

var jsonData = '09/10/2015'; 
var app = {date: ko.observable(jsonData)}; 
ko.applyBindings(app); 

Теперь ваш splitDate объект может быть использован в качестве виртуальной машины для компонентной модели datepicker (или зритель). Я не знаю, что стоит за вашими геттерами и сеттерами, но я сделал немного test case here, используя записываемые вычисления с некоторой базовой проверкой.

Смежные вопросы