无法解析本地json

时间:2013-06-12 21:55:44

标签: javascript ajax json extjs sencha-touch-2

我刚开始使用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上进行测试,不幸的是,这两个浏览器的单元测试都失败了。

谢谢!

1 个答案:

答案 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);
        });
    });
});