Ext JS:将单个数据库条目加载到模型中

时间:2013-12-30 20:42:13

标签: ajax extjs model extjs4.2

我正在尝试使用单个数据库条目创建模型,而不是仅为一行创建商店......没有意义。无论如何,我可以使用static load method创建模型,但我模型的代理的URL是动态的,所以这不是一个选项,因为我想只是动态加载。此外,创建模型的实例似乎不起作用,因为我不能使用load方法,因为它是静态的......

我已经开始尝试使用Ajax调用来获取数据,然后将其加载到模型的实例中,但是即使普通字段值存在,关联关系也似乎无法创建。这就是我想要做的事情:

代码

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

// MY_MODEL
Ext.define('MY_MODEL', {
  extend: 'Ext.data.Model',
  fields: ['name', 'id'],
  hasMany: [{
    associationKey: 'sections', name: 'getSections', model: 'SectionsModel'
  }],
  proxy: {
    type: 'memory',
    reader: {
      type: 'json',
      root: 'configuration'
    }
  }
});

var url = 'my/url';
Ext.Ajax.request({
  url: url,
  method: 'GET',
  scope: this,
  success: function(res) {
     var configObj = Ext.decode(res.responseText);
     var configModel = Ext.create('MY_MODEL', configObj);
     console.log(configModel);
  },
  failure: function(res) {
    console.error('failed');
  }
});

响应

{
  "code": 200,
  "configuration": {
    "name": "TestConfiguration",
    "id": 1,
    "sections": [{
       "name": "section1"
    }, {
       "name": "section2"
    }]
  }
}

上面的代码是我为此示例编写的虚拟代码...如果它不起作用,请将其视为伪代码。就像我说的那样,当我使用静态load method时它确实有效,并且我可以成功地进行Ajax调用......问题是如何使用给定数据创建模型。我是否需要将 config 传递给模型的构造函数,并将模型的代理数据设置为传入 config ?这是正确的协议吗?我只想在这里找出最好的方法。谢谢!

Sencha forums交叉发布。

1 个答案:

答案 0 :(得分:1)

我得到了一个解决方案,感谢Mitchell Simoens的一个blog post。我改变了MY_MODEL看起来像这样:

Ext.define('MY_MODEL', {
  extend: 'Ext.data.Model',
  fields: ['name', 'id'],
  hasMany: [{
    associationKey: 'sections', name: 'getSections', model: 'SectionsModel'
  }],
  constructor: function(data) {
    this.callParent([data]);
    var proxy = this.getProxy();
    if (proxy) {
      var reader = proxy.getReader();
      if (reader) {
        // this function is crucial... otherwise, the associations are not populated
        reader.readAssociated(this, data);
      }
    }
  },
  proxy: {
    type: 'memory',
    reader: {
      type: 'json'
    }
  }
});

// in the success of the Ajax call
success: function(res) {
  var configObj = Ext.decode(res.responseText);
  var configModel = Ext.create('MY_MODEL', configObj.configuration);
  console.log(configModel);
}