【问题标题】:load event not firing in jsonstore加载事件未在 jsonstore 中触发
【发布时间】:2011-10-28 23:47:39
【问题描述】:

团队,

我有一个 jsonstore 来加载我的列表。我正在使用没有任何代理配置的内联数据加载商店。我想调用我商店的加载事件。请告诉我该怎么做。

以下是我的店铺代码:

Store = new Ext.data.JsonStore({ 模型:'SettingModel',

getGroupString:function(){
        return 'Set Duration';
        },
autoLoad:false,     
data: [
    {name: '5 mins',   value: '5'},
    {name: '15 mins',   value: '15'},
    {name: '25 mins',   value: '25'},
    {name: '45 mins',   value: '45'}
],
listeners : {
    'load': function(){
        Ext.Msg.alert('App',"load");
    }
}});

Store.load();

使用上面的代码,我收到以下错误消息:“未捕获的错误:您正在使用 ServerProxy,但没有为其提供 url”

如果我删除“Store.load();”行,我没有收到错误,并且列表正在填充数据。但是 load 事件没有被触发。

请帮助我如何在这种情况下触发加载事件。

提前致谢

【问题讨论】:

    标签: extjs sencha-touch


    【解决方案1】:

    加载事件在数据内联时不会被调用。此外,只有在必须使用 AJAX 请求访问数据时才应调用 load 方法(这就是为什么在调用 .load() 方法时需要代理 url 的原因)。

    尝试使用 loadData 方法 来加载内联数据,而不是在对象构造函数和 datachanged 事件 中传递它,如果您想在每次调用 loadData 时进行监听。

    【讨论】:

      【解决方案2】:

      Ext 似乎正在推动商店与模型等一起使用。 感觉就像,因为您使用的是商店,它希望您执行 ajax 调用来获取数据。 您可以通过指定代理来覆盖它:

              proxy: {
                  type: 'memory',
                  reader: {
                      type: 'json',
                      root: 'items'
                  }
              },
      

      直接来自商店的 Ext 文档:http://dev.sencha.com/deploy/touch/docs/

      Ext.regModel('User', {
      fields: [
          {name: 'firstName', type: 'string'},
          {name: 'lastName',  type: 'string'},
          {name: 'age',       type: 'int'},
          {name: 'eyeColor',  type: 'string'}
      ]
      });
      

      哦,看,他们的本地存储中没有内存代理!

      new Ext.data.Store({
      model: 'User',
      data : [
          {firstName: 'Ed',    lastName: 'Spencer'},
          {firstName: 'Tommy', lastName: 'Maintz'},
          {firstName: 'Aaron', lastName: 'Conran'},
          {firstName: 'Jamie', lastName: 'Avins'}
      ]
      }); 
      

      作为一个有趣的奖励,JsonStore 甚至不在触摸文档中。

      http://jsfiddle.net/6WV3m/3/ 是 extjs 4.0 代码,但它适用于我的本地触摸。

      【讨论】:

        【解决方案3】:

        首先,您需要确保您的商店正在被使用。你有 autoLoad:false,所以它不会自己加载。您绑定它的组件必须随后加载它,或者您必须调用它的加载方法。此外,您应该检查异常状态。

        通常你希望采用以下格式:

        listeners : {
            load : {
                    fn : function(){
                            Ext.Msg.alert('App',"load");
                    },
                    scope : this
                },
            exception : {
                    fn : function( err ){
                            Ext.Msg.alert('App',"Oh Crap!"+err);
                    },
                    scope : this
                }
        }
        

        这样你可以控制功能和范围,这是一个常见的问题,

        【讨论】:

          【解决方案4】:

          pablodcar 的回答应该真的适合你。您可以使用空数据数组实例化您的商店,然后使用您要加载的数据数组调用loadData() 方法。如果您使用 storeId 启动您的商店,然后使用 Ext.data.StoreManager.lookup(storeId) 查找它,则可以从任何地方调用此方法。

          要在商店数据更改时收到通知,您可以收听datachanged 事件。

          【讨论】:

            猜你喜欢
            • 2013-04-09
            • 2013-11-23
            • 2016-10-27
            • 1970-01-01
            • 2014-01-01
            • 1970-01-01
            • 2015-05-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多