2013-06-12 4 views
0

Предположим, у нас есть структура:Определение модели локального хранилища данных?

model_Projects владеет массивом model_Category. Каждая модель_Категория владеет массивом model_SubCategory.

У меня на самом деле есть магазин model_Projects, который имеет localStorage Proxy.

Что происходит, когда я загружаю sync() и загружаю() мой магазин model_Projects, в каждом model_Projects мой массив model_Category является хорошим размером, и каждая ячейка содержит объект.

Что плохого в том, что каждый из этих объектов не являются объектом model_Category ...

Вот мой console.log() функция проекта

console.log('\n' + this.get('strTitle') + ' - ' + this.get('strType')); 
console.log(this.get('strVersion')); 
console.log('Event will be on : ' + this.get('dateOfProject') + '\n'); 


var arrCategory = this.get('arrCategory'); 
var arrSub; 
var arrType; 

for(i in arrCategory) 
{ 
    console.log(arrCategory[i].get('strTitle') + ' Total : ' + arrCategory[i].get('numTotal') + '\n'); 

    //Each Sub Category 
    arrSub = arrCategory[i].get('arrSubCategory'); 
    for(j in arrSub) 
    { 

     if(arrCategory[i].get('arrSubTotal') === undefined) 
     console.log('\t' + arrSub[j].get('strTitle')); 
     else 
     console.log('\t' + arrSub[j].get('strTitle') + '\t SubTotal : ' + arrCategory[i].get('arrSubTotal')[j]); 

     arrType = arrSub[j].get('arrType'); 
     arrValue = arrSub[j].get('arrValue'); 
     arrCOFactor = arrSub[j].get('arrCOFactor'); 
     for(var k=0; k<arrType.length; k++) 
     { 
      if(arrValue === undefined) 
      console.log('\t\t' + arrType[k] + '\t\t Value : ' + 'NA' + '\t\t COFactor : ' + arrCOFactor[k]); 
      else 
      console.log('\t\t' + arrType[k] + '\t\t Value : ' + arrValue[k] + '\t\t COFactor : ' + arrCOFactor[k]); 

     } 
     console.log(''); 
    } 
} 

console.log('\n'+this.get('strTitle') + ' - ' + this.get('strType') + '\n'); 

Вот project.show() сразу после создания, прочитайте из хранилища проектов.

Created

А вот то, что я получаю, когда я project.show() после загрузки проекта магазина

after-load

Если мы открываем ошибку мы получаем следующую строку сбоев:

console.log(arrCategory[i].get('strTitle') + ' Total : ' + arrCategory[i].get('numTotal') + '\n'); 

похоже, что arrCategory [i] больше не является моделью категории ... wtf

Кто-нибудь знает, что происходит?

ответ

1

Док говорит:

LocalStorageProxy использует новый HTML5 LocalStorage API для сохранения данных Model локально на клиентском браузере. HTML5 localStorage - это хранилище ключей (например, не может сохранять сложные объекты, такие как JSON), поэтому LocalStorageProxy автоматически сериализует и десериализует данные при сохранении и извлечении данных.

Допустим, у вас есть объект модели:

var category = Ext.create('My.Category', { ... }); 

Этот объект будет сериализовать в строку JSON, чтобы быть сохранялось в БД. Но объекты JSON не могут иметь функций, только свойства преобразуются в JSON. Вот почему вы возвращаете сломанный объект.

Вы можете использовать этот пример кода, чтобы доказать самому себе:

var o = {foo: 'bar', fn: function() {console.log('Hey!')}}; 
console.log(o); // => Object {foo: "bar", fn: function} 

var json = Ext.encode(o); 
console.log(json); // => {"foo":"bar","fn":null} 

var o2 = Ext.decode(json); 
console.log(o2); // => Object {foo: "bar", fn: null} 

Обратите внимание, что функция теряется, как только на этапе кодирования JSON.

+0

omg поэтому моя система обречена ... – Fawar

+0

Прокси-сервер должен заботиться о сохранении только данных моделей и восстановлении объектов модели из данных в хранилище. Вы сталкиваетесь с проблемой, потому что у вас есть некоторые объекты модели (Категория) в ** данных ** записи (Project), которую вы сохраняете. Вместо того, чтобы помещать туда необработанный объект, вы должны настроить ассоциацию ['HasMany'] (http://docs.sencha.com/touch/2.2.1/#!/api/Ext.data.association.HasMany).Будьте готовы, это немного сложно в первый раз ... – rixo

+0

Как бы много помогли мне? – Fawar

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