2013-12-05 1 views
0

Я уже возился с примером ember.js todoMVC. Сделал это и отлично работал, но, чтобы узнать больше, я начал его модифицировать.Использование toJSON в записи ember.js, устанавливает один из атрибутов на нуль

Я обновил модель от этого:

Todos.Todo = DS.Model.extend({ 
    title: DS.attr('string'), 
    isCompleted: DS.attr('boolean'), 
}); 

к этому:

Todos.Todo = DS.Model.extend({ 
    title: DS.attr('string'), 
    isCompleted: DS.attr('boolean'), 
    date: DS.attr('date') 
}); 

(я использую уголек-данных, а).

Добавлено в шаблон, чтобы иметь возможность ввести дату, а затем обновили действие контроллера для createTodo к этому:

actions: { 
    createTodo: function(){ 
     var title = this.get('newTitle'); 
     var date = this.get('newDate');  

     if(!title.trim()){ 
      return; 
     } 

     var todo = this.store.createRecord('todo',{ 
      date: date, 
      title: title, 
      isCompleted: false    
     }); 

     //this clears the input field value 
     this.set('newTitle', ''); 
     this.set('newDate', ''); 

     //and save the instance of the model. 
     todo.save(); 
    }, 
//...More code 

Великих, все работает, так что потом я спасаю его localstorage используя localstorage adapter ,

Это место, где вещи разрушаются, дата не сохраняется до localstorage, а также из-за методов toJSON и serialize, которые используются в адаптере.

В частности, адаптер делает это:

_addRecordToNamespace: function (namespace, record) { 
      var data = record.serialize({includeId: true}); 
      namespace.records[data.id] = data; 
    } 

Который берет _data суб-объект, который является частью записи, и который выглядит так:

//taken from the chrome inspector 
_data: Object 
    __ember1386208719445_meta: Meta 
    date: "12/11/2013" 
    isCompleted: false 
    title: "testing something" 
    __proto__: Object 

и возвращается:

Object {title: "testing something", isCompleted: false, date: null} 

toJSON возврат же.

SO TLDR & & Вопрос:

Почему методы toJSON и serialize установить мой date к нулю, когда она явно имеет значение, и это значение является строкой?

ответ

-1

Ваш формат даты недействителен. Попробуйте «2013-02-07T16: 44: 57» вместо «12/11/2013».

+1

Формат не имеет значения. Это строка. Но ради тщательности я попробовал то, что вы предложили, и это не устранило проблему. – Ryan

+0

Да, это строка, но ваш DS.attr указывает ее как дату, поэтому он ожидает определенный формат. Попробуйте изменить мой ответ. – chopper

+0

Это хорошо знать о DS.attr, но я не думаю, что это проблема. Если я посмотрю на запись в инспекторе ember, там будет дата, только когда я обновляю страницу, и она должна извлечь запись из адаптера, что дата больше не существует. И я могу повторить ошибку, назначив запись объекту окна, а затем в инспекторе хрома, вызывающем 'serialize()' или 'toJSON()' на нем. – Ryan

1

Это потому, что вы сказали, что это тип даты, но вы устанавливали его как строку, поэтому, когда данные ember пытались его сериализовать, он был сбит с толку, потому что ожидал дату, поэтому он вернет null.

serialize: function(date) { 
    if (date instanceof Date) { 
    var days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; 
    var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; 

    var pad = function(num) { 
     return num < 10 ? "0"+num : ""+num; 
    }; 

    var utcYear = date.getUTCFullYear(), 
     utcMonth = date.getUTCMonth(), 
     utcDayOfMonth = date.getUTCDate(), 
     utcDay = date.getUTCDay(), 
     utcHours = date.getUTCHours(), 
     utcMinutes = date.getUTCMinutes(), 
     utcSeconds = date.getUTCSeconds(); 


    var dayOfWeek = days[utcDay]; 
    var dayOfMonth = pad(utcDayOfMonth); 
    var month = months[utcMonth]; 

    return dayOfWeek + ", " + dayOfMonth + " " + month + " " + utcYear + " " + 
     pad(utcHours) + ":" + pad(utcMinutes) + ":" + pad(utcSeconds) + " GMT"; 
    } else { 
    return null; 
    } 
} 
+0

Да, когда я увидел, что, взяв тип 'date' из' DS.attr() 'исправил его, я пошел и посмотрел на источник для данных ember и увидел, что вы разместили. – Ryan