2013-05-03 54 views
0

这是怎么回事,我有一个列表,我工作得很好,如果我硬编码数据使用商店的数据属性,但是当我尝试使用代理不显示什么...代理管理发送数据&从服务器接收数据,但仍列表拒绝说明了什么?Sencha2代理检索数据,但列表不显示

这是视图:

Ext.define('MyApp.view.myListView', { 
extend: 'Ext.List', 
xtype: 'myListView', 
requires: ['MyApp.store.myListStore'], 
config: { 
    title: 'American Companies', 
    grouped: false, 
    itemTpl: '{company} {contact}', 
    store: 'myListStore', 
    onItemDisclosure: true 
}}); 

型号:

Ext.define('MyApp.model.myListModel', { 
    extend: 'Ext.data.Model', 
    config: { 
    fields: ['company', 'contact'] 
    } 
}); 

的商店:

Ext.define('MyApp.store.myListStore', { 
    extend: 'Ext.data.Store', 


    requires: ['MyApp.model.myListModel', 'MyApp.proxy.myListProxy'], 


    config: { 
     model: 'MyApp.model.myListModel', 
     proxy: 'searchProxy', 
     autoLoad: true, 
     grouper: { 
      groupFn: function (record) { 
       return record.get('contact').substr(0, 1); 
      } 
     } 
    } 
}); 

代理:

Ext.define('MyApp.proxy.myListProxy', { 
    extend: 'Ext.data.proxy.Ajax', 
    alias: 'proxy.searchProxy', 
    method: 'POST', 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json' 
    }, 
    callbackKey: 'callback', 
    type: 'json', 
    config: { 
     model: 'MyApp.model.myListModel', 
     url: '/myUrl that works', 
     reader: { 
      type: 'json', 
      rootProperty: 'data' // E.g. {results: [{id: 123, description: 'some  text'}, {...}]}, 
     } 
    }, 
    read: function (operation, callback, scope) { 
      Ext.Ajax.request({ 
      url: '/myUrl that works', 
      //success: passFn, // function called on success 
      failure: failFn, 
      jsonData: { 
       "data": { 
        "fields": ["company", "contact"], 
       } 
      } 
     }); 

    }, 


    filterParam: undefined, 


    /** 
    * NOTE: so I can add other params as I needed the params for a search request 
    * You could use extraParams instead 
    */ 
    buildRequest: function(operation) { 
     var request = this.callParent(arguments); 
     var params = request.getParams(); 
//  var searchRequest = getSearchRequest(); // helper method 
//  if (searchRequest) { 
//   Ext.apply(params, searchRequest); 
//  } 
     return request; 
    } 


}); 


function failFn(msg) { 
    Ext.Msg.alert('Ajax Error', msg); 
} 
+0

你为什么要重写代理中的'read'方法? – SachinGutte 2013-05-04 10:49:02

+0

事实上,这是它为我工作的方式......没有阅读功能,我无法做到这一点,以及事实上没有ajax请求..单独的代理没有发送任何数据,我是新来的这个哈哈 – martuanez 2013-05-05 13:48:37

+0

结帐回答下面。我自己尝试过,并且工作。 :D – SachinGutte 2013-05-05 13:56:19

回答

2

更改read覆盖到以下 -

read: function (operation, callback, scope) { 
    var that = this; 

    Ext.Ajax.request({ 
     url: 'yout_url_here', 
     success: function(response,request){ 
      var receivedData = Ext.JSON.decode(response.responseText.trim()); 

      operation.setResultSet(Ext.create('Ext.data.ResultSet', { 
       records: receivedData.data, 
       total : receivedData.data.length 
      })); 

      operation.setSuccessful(); 
      operation.setCompleted(); 

      if (typeof callback == "function") { 
       callback.call(scope || that, operation); 
      } 
     }, 
     failure: failFn, 
     jsonData: { 
      "data": { 
       "fields": ["company", "contact"] 
      } 
     } 
    }); 

}, 

为每文档阅读方法 -

执行给定的读取操作。如果您在自定义代理中覆盖此方法,请记住在完成操作后始终调用所提供的回调方法。

因此您需要再次调用该回调。但只是称它是不够的。从服务收到的数据需要分配到Ext.data.Operation。所以一个新的ResultSet必须创建并分配数据。 这将允许商店将数据分配到列表。如果ResultSet未设置,则存储将不会加载数据。

我试图与下面的JSON和它的工作 -

{ 
    "data":[ 
     { 
     "company":"a", 
     "contact":"b" 
     }, 
     { 
     "company":"a", 
     "contact":"b" 
     }, 
     { 
     "company":"a", 
     "contact":"b" 
     }, 
     { 
     "company":"a", 
     "contact":"b" 
     } 
    ] 
} 

给这个一杆。但恕我直言,你不会需要重写read方法。如果要在将其附加到列表之前处理收到的数据,则可能需要使用此方法。我不知道你是否想要这个。

但上面的解决方案为我工作,也将为你。 :)

+0

它就像一个魅力!非常感谢!然而,我仍然在读者问题上挠头,你能否如此友善地让我知道没有读者会怎么样? – martuanez 2013-05-06 12:25:13

+0

很高兴它帮助你。如果你只是删除'读'覆盖,它应该工作。你已经在配置中为rootProperty和数据类型提供了默认值。代理服务器就足够了。我会尽量在业余时间提供细节。 :D – SachinGutte 2013-05-06 12:41:12

+0

谢谢!我真的很想重构它,并学习正确的方法,你已经做了很多,所以再次感谢! – martuanez 2013-05-06 21:15:52