从另一家商店访问商店 - Sencha Touch

时间:2013-12-13 13:50:03

标签: extjs model-view-controller sencha-touch-2

我正在尝试创建一个商店,并从另一个商店内部访问数据以构建代理网址。

这样的事情:

Ext.define('MyApp.store.Post',{
extend:'Ext.data.Store', 
config: {
    model: 'MyApp.model.Post',
    proxy: {
        type: 'ajax',
        url: 'http://mywebsite.com/get?userid=' + Ext.getStore('UserData').getAt(0).data.userid,
        reader: {
            type: 'json'
        }
    }
}
});

所以,我基本上试图从另一个商店获取用户标识,以便能够构建正确的URL。 这不起作用,我得到:

Uncaught TypeError: Object #<Object> has no method 'getStore' 

这样做的正确方法是什么?

编辑:好的,我输入了一个虚拟网址并尝试用监听器更改它,这是我的商店:

Ext.define('MyApp.store.Post',{   extend:'Ext.data.Store', 
config: {
      fields: [
                        'title', 'link', 'author', 'contentSnippet', 'content'
                    ],
    proxy: {
        type: 'jsonp',
        url: 'https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://feeds.feedburner.com/SenchaBlog',
        reader: {
            type: 'json',
            rootProperty: 'responseData.feed.entries'
        }
    },
    listeners: [
        {
            beforeload: function(){
               console.log("store loaded");   //I DON'T SEE THIS IN CONSOLE
               return true;
            }    
        }
    ]
},

});

3 个答案:

答案 0 :(得分:2)

基本上你没有做错任何事,但原因是sencha touch使用异步加载,似乎Ext.getStore()在你的商店定义时没有实例化。

让我们试试这个方法:

首先,在商店配置中为beforeload事件添加一个监听器:

Ext.define('MyApp.store.Post',{
extend:'Ext.data.Store', 
config: {
    model: 'MyApp.model.Post',
    proxy: {
        type: 'ajax',
        //url: you don't even need to set url config here, simply ignore it
        reader: {
            type: 'json'
        }
    }
},
listeners: [
    {
        fn: 'setUrl',
        event: 'beforeload'
    }
]
});

然后在同一个文件中声明一个这样的函数:

setUrl: function(){
    this.getProxy().setUrl(Ext.getStore('UserData').getAt(0).data.userid);
    return true;
}

这样,可以确保在加载商店代理之前设置该代理的URL。当时,所有核心方法都是实例化的。

更新:请在您的帖子商店试用:

Ext.define('MyApp.store.Post',{
   extend:'Ext.data.Store', 
   config: {
       //autoLoad: true,
          fields: ['title', 'link', 'author', 'contentSnippet', 'content'],
        proxy: {
            type: 'jsonp',
            url: 'dummy url',
            reader: {
                type: 'json',
                rootProperty: 'responseData.feed.entries'
            }
        },
   },

    initialize: function(){
        console.log("loaded!");
        this.getProxy().setUrl('https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://feeds.feedburner.com/SenchaBlog');
        //return true;
    }    
});

在阅读了pull-to-refresh插件的源代码后,我发现Sencha Touch使用Ext.data.Operation代替Ext.data.Store.load()函数。因此,您必须将其放入initialize方法中。

答案 1 :(得分:0)

使用Ext.data.StoreManager.lookup('UserData')获取商店实例。

但是在你的情况下,我会在某个地方使用它,你可以使用userid:

var postsStoreInstance = ...;
postsStoreInstancegetProxy()._extraParams.userid = userid;

它向商店的代理URL添加查询paremetry

答案 2 :(得分:0)

你这样做的方法是正确的。商店定义的代码是什么?

确保您的商店有storeId: 'UserData'

请参阅此工作示例:

Ext.define('User', {
   extend: 'Ext.data.Model',
   fields: [
       {name: 'id'}
   ]
});

Ext.create( 'Ext.data.Store', {
   model: 'User',
   storeId: 'UserData'
});

Ext.define('MyApp.store.Post',{
   extend:'Ext.data.Store', 
   config: {
       model: 'MyApp.model.Post',
       proxy: {
           type: 'ajax',
           url: 'http://mywebsite.com/get?userid=' + Ext.getStore('UserData'),
           reader: {
               type: 'json'
           }
       }
   }
});