我刚开始使用Sencha Touch并开始使用2.2.1版本。出于某种原因,我无法让我的本地json正确解析。我知道这不是响应问题,因为我可以在我的chrome开发工具中看到json。
这是我的store
Ext.define('MyApp.store.Tasks', {
extend: 'Ext.data.Store',
requires: [
'MyApp.model.Task'
],
config: {
autoLoad: true,
storeId: 'tasksStore',
model: 'MyApp.model.Task',
proxy: {
type: 'ajax',
url: 'tasks.json',
reader: {
type: 'json',
rootProperty: 'tasks'
}
}
}
});
这是我的Model
Ext.define('MyApp.model.Task', {
extend: 'Ext.data.Model',
config: {
fields: [
{ name: 'id', type: 'int' },
{ name: 'task', type: 'string', defaultValue: 'task' }
]
}
});
我正在使用Jasmine
来测试我的商店。这是我的规格
describe('MyApp.store.Tasks', function() {
it('Number of tasks should be four', function() {
var store = Ext.create('MyApp.store.Tasks');
expect(store.getCount()).toBe(4);
});
});
而且,这是我的样本json
文件。它与Sencha的index.html
文件位于同一目录中,该文件是根目录。
{
"tasks":[
{
"task":"Some Product",
"id":0
},
{
"task":"Another Product",
"id":1
},
{
"task":"A third product",
"id":2
},
{
"task":"A fourth product",
"id":3
}
]
}
是否因为实例化问题?或者我在这里错过了一些关键的部分?我尝试了jsonp代理类型,但它需要一个围绕响应的包装器,我不知道该怎么做。我正在Safari和Chrome上进行测试,不幸的是,这两个浏览器的单元测试都失败了。
谢谢!
答案 0 :(得分:1)
存储加载是异步的,因此您无法在创建数据后立即访问它们。
要知道商店何时加载,您可以收听商店的load
event:
var store = Ext.create('MyApp.store.Tasks');
// you cannot use the store's data yet
// expect(store.getCount()).toBe(4);
store.on('load', function(records, success) {
if (success) {
// here the store has been loaded
expect(store.getCount()).toBe(4);
}
});
或者,您也可以将回调传递给load
method:
var store = Ext.create('MyApp.store.Tasks', {autoLoad: false});
store.load({
callback: function(records, operation, success) {
if (success) {
// here the store has been loaded
expect(store.getCount()).toBe(4);
}
}
});
现在,这意味着您还需要make your Jasmine test asynchronous:
describe('MyApp.store.Tasks', function() {
it('Number of tasks should be four', function() {
var result = null,
store = Ext.create('MyApp.store.Tasks');
store.on('load', function(store, records, success) {
result = success;
});
// using jasmine async...
waitsFor(function() {
return result !== null;
});
// this functin will be executed when the one in waitsFor returns true
runs(function() {
expect(store.getCount()).toBe(4);
});
});
});