本地存储崩溃模型定义?

时间:2013-06-12 18:58:24

标签: extjs sencha-touch-2 sencha-architect

假设我们有以下结构:

model_Projects拥有一个model_Category数组。 每个model_Category都拥有一个model_SubCategory数组。

我实际上有一个model_Projects商店,它有一个localStorage Proxy。

当我在每个model_Projects中加载sync()和load()我的model_Projects存储时,我的数组是一个好的大小,每个单元格都包含一个对象。

错误的是每个对象都不是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 个答案:

答案 0 :(得分:1)

医生说:

  

LocalStorageProxy使用新的HTML5 localStorage API在客户端浏览器上本地保存Model数据。 HTML5 localStorage是一个键值存储(例如,无法保存像JSON这样的复杂对象),因此LocalStorageProxy在保存和检索数据时会自动对数据进行序列化和反序列化。

假设你有一个模型对象:

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

此对象将序列化为要在db中保留的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编码步骤,该函数就会丢失。