无法从sencha touch 2中的json文件加载数据

时间:2012-08-30 13:47:15

标签: sencha-touch-2 store

我试图让sencha touch 2数据管理示例工作但没有用。这是一个不起作用的简单模型和商店的代码(getCount返回0)。

Ext.define('MyClient.model.Product', {
    extend:'Ext.data.Model',
    config:{
        fields:['name', 'image'],
        proxy:{
            type:'ajax',
            url:'http://localhost/st2/Projets/my-client-sencha/data/products.json',
            reader:{
                type:'json',
                rootProperty:'products',
                successProperty:'success'
            }
        }
    }
});

Ext.define('MyClient.store.ProductsStore', {
    extend:'Ext.data.Store',
    config:{
        model:'MyClient.model.Product',
        autoLoad:true,
        autoSync:true
    }
});

在启动功能中,我有以下几行:

        var prod = Ext.create('MyClient.store.ProductsStore');
        prod.load();
        alert(prod.getCount());

最后这是我的products.json:

[

    {
        "name":"test"
    }
]

我在控制台中没有收到任何错误,但getCount总是返回0.请在这里使用一些帮助。

编辑:错误的JSON,不适用于此:

{
    "success":true,
    "products": [

        {
            "name":"test"
        }
    ]
}

2 个答案:

答案 0 :(得分:1)

由于你设置了rootProperty:'products',你的json必须像

{
    products: [

        {
            "name":"test"
        }
    ]
}

如果您不想从config更改服务器响应移除rootProperty。

查看Json Reader doc

啊......你忘记了负载()的asyn性质....

var prod = Ext.create('MyClient.store.ProductsStore');
prod.load(function ( ){
    alert(prod.getCount());
});

请注意,prod.load()仅用于测试目的,因为您已设置属性autoLoad:true。

在你的代码片段中,加载程序会进行两次类似的调用。

干杯,奥列格

答案 1 :(得分:0)

Ext.define('MyBizilinkms.model.Customer', {
extend: 'Ext.data.Model',

config: {
    identifier:'uuid',
    fields: [
    'CustId',
    'EMail',
    'Title',
    'FName', 
    'MdInitial', 
    'LName', 
    'PhnNum', 
    'SecondPhnNo', 
    'DOB', 
    'Address', 
    'SecondAddress', 
    'City',
    'State', 
    'Zip', 
    'Country', 
    'RecieveEmail',
    'IsSaveonServer',
    { 
        name: 'Full_Name',
        type:'string',
        convert:function(v, rec) {
            return rec.data.FName + " " + rec.data.LName;
        }
    }],
    validations: [
    {
        type: 'format',   
        name: 'EMail', 
        matcher: /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/, 
        message:"Valid Email Required"
    },
    {
        name: 'PhnNum',             
        type : 'custom',
        message : "Valid Phone required",
        validator : function(config, value, model) {
            var reg = /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/;
            return reg.test(value);
        }            
    },
    {
        name: 'SecondPhnNum',             
        type : 'custom',
        message : "Valid 2nd Phone required",
        validator : function(config, value, model) {
            if (!Ext.isEmpty(value)) {
                var reg = /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/;
                return reg.test(value)
            }
            return true;
        }            
    },
    {
        type: 'presence', 
        name: 'FName', 
        message : "First Name is required"
    },
    {
        type: 'presence', 
        name: 'LName', 
        message : "Last Name is required"
    }, 
    {
        type: 'presence', 
        name: 'Address', 
        message : "Address is required"
    },
    {
        type: 'presence', 
        name: 'City', 
        message : "City is required"
    },
    {
        name: 'State',             
        type : 'custom',
        message : "Valid State required",
        validator : function(config, value, model) {
            var reg = /^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i;
            if(Ext.isEmpty(value))
                value = '00'
            var state = value.replace(/^\s+|\s+$/g, "");

            return reg.test(state)
        }            
    },
    {
        name: 'Zip',             
        type : 'custom',
        message : "Valid Zip required",
        validator : function(config, value, model) {
            var reg = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
            return reg.test(value)
        }            
    },
    {
        type: 'presence', 
        name: 'Country', 
        message : "Country is required"
    }
    ]       
},
getFullName: function() {
    return this.get('FName') + '' + this.get( 'LName');
}
});