Sencha Touch:如何更新数据存储以从控制器列出

Posted

技术标签:

【中文标题】Sencha Touch:如何更新数据存储以从控制器列出【英文标题】:Sencha Touch: how to Update data Store to list from controller 【发布时间】:2013-04-12 09:30:54 【问题描述】:

从控制器更新列表时遇到问题。我有商店、模型和列表来显示 Json 数据。能够获取数据但无法更新列表。如果我的商店中的 ajax 调用能够使用列表进行数据处理,但不会调用列表器。所以我将代码移动到控制器。 这是我的商店:

Ext.define('MyApp.store.StoreList', 
    extend:'Ext.data.Store',
    requires:['MyApp.model.ModelList'],
    config:
        model:'MyApp.model.ModelList',
        autoLoad:'true',
        storeId:'id_StoreList'
    
);

型号:

Ext.define('MyApp.model.ModelList', 
    extend: 'Ext.data.Model',
    xtype:'modelList',
    config: 
        fields:['name']

);

控制器

Ext.define('MyApp.controller.Main', 
extend : 'Ext.app.Controller',
requires : ['MyApp.view.MyList'],
config : 
    refs : 
        loadbtn:'button[action=loadbtn]',
        dataList: '#id_listitems'


    ,
    control : 
        "#dataList": 
            itemtap: 'onListItemTap'
        ,
        loadbtn:
            tap : 'handleloadbtn'
        

    

,

handleloadbtn: function()
    console.log('loadbtn tapped');
    Ext.Viewport.setMasked(xtype:'loadmask',message:'loading...');
    this.ajaxCall();
,

ajaxCall:function()
    Ext.Ajax.request(
        method: 'POST',
        scope: this,
        extraParams: 
            Details: true
        ,

        url:'http://localhost:9080/works',
        actionMethods: 
            create : 'POST',
            read   : 'POST', // by default GET
            update : 'POST',
            destroy: 'POST'
        ,
        headers :
            "Content-Type" :'application/xml',
            'Accept':'application/json'
        ,
        reader:
        
            type:'json'
        ,
        success: function(response)
            console.log('success');

            // var list = Ext.getCmp('id_listitems')
            //var store = Ext.getStore('id_StoreList');
            var store = Ext.data.StoreManager.lookup('id_StoreList');
            this.getDataList().setStore(store);
           //Error : Uncaught ReferenceError: getDataList is not defined 
            console.log('test:',test);
            Ext.Viewport.setMasked(false);
        
    )

);

列表:

Ext.define('MyApp.view.MyList',
    extend:'Ext.Panel',
    xtype:'myList',
    requires:['Ext.dataview.List'],
    config:
        layout:'fit',
        stylehtmlContent:'true',
        styleHtmlCls:'showListCls',
        items:[
            
                docked:'top',
                items:[
                    
                        xtype:'button',
                        text:'Load',
                        ui:'Plain',
                        action:'loadbtn',
                        width:'180px',
                        height:'30px',
                        docked:'right',
                        margin : '5 15 5 0'
                    
                ]
            ,
            
                xtype:'list',
                id: 'id_listitems',
                action:'list_Item_Action',
                store:'StoreList',
                itemTpl:['name'
                ]
            
        ]
    
);

谁能帮我解决这个问题?谢谢。

【问题讨论】:

【参考方案1】:

你需要像这样使用this.getDataList()

Ext.Ajax.request(
    method: 'POST',
    extraParams: 
        Details: true
    ,

    url:'http://localhost:9080/works',
    actionMethods: 
        create : 'POST',
        read   : 'POST', // by default GET
        update : 'POST',
        destroy: 'POST'
    ,
    headers :
        "Content-Type" :'application/xml',
        'Accept':'application/json'
    ,
    reader:
    
        type:'json'
    ,
    success: function(response)
        console.log('success');

        // var list = Ext.getCmp('id_listitems')
        //var store = Ext.getStore('id_StoreList');
        var store = Ext.data.StoreManager.lookup('id_StoreList');
        this.getDataList().setStore(store);
       //Error : Uncaught ReferenceError: getDataList is not defined 
        console.log('test:',test);
        Ext.Viewport.setMasked(false);
    ,
    scope: this
);

您还需要将scope: this 添加到您的请求配置对象中,以便success 方法中的this 不是请求而是您的控制器。

希望这会有所帮助。

【讨论】:

【参考方案2】:

我想你可以试试这个。 你的商店看起来像

Ext.define('MyApp.store.StoreList', 
    extend:'Ext.data.Store',
    requires:['MyApp.model.ModelList'],
    config:
        model:'MyApp.model.ModelList',
        autoLoad:'true',
         clearOnPageLoad: false,       
        proxy: 
            type: 'jsonp',
            useDefaultXhrHeader: false,
            url: 'http://localhost:9080/works',
            reader: 
                type: 'json',
                rootProperty: "Items" //It depends on your json data structure

            ,
            callbackKey: 'callback'
        
    
);

在Controller的“handleloadbtn”函数中,你可以直接调用

Ext.getStore("StoreList").load(); //despite of the config "autoLoad:true"

【讨论】:

以上是关于Sencha Touch:如何更新数据存储以从控制器列出的主要内容,如果未能解决你的问题,请参考以下文章

更新/更改列表组件 sencha touch 的存储

Sencha Touch - 本地存储问题

Sencha Touch 存储同步

在 Sencha Touch MVC 应用程序中更新子面板

Sencha touch 2 filterby() 不更新记录

Sencha touch 2、多物品轮播