我正在尝试创建一个商店,并从另一个商店内部访问数据以构建代理网址。
这样的事情:
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;
}
}
]
},
});
答案 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'
}
}
}
});