【问题标题】:ExtJS 4: How to associate model with another, pre-existing model by ID?ExtJS 4:如何通过 ID 将模型与另一个预先存在的模型相关联?
【发布时间】:2011-12-21 01:40:23
【问题描述】:

假设我有一个 ModelA 实例,它可以“拥有许多”ModelB 实例。给定服务器上已经存在的 ModelB 记录的 id,如何将模型 A 与模型 B 关联? (API 文档只展示了如何通过同时创建新的模型 B 实例和数据库记录来做到这一点。)

例如,假设我有一个应用程序,可以使用 Person 和 Meeting 对象安排会议。服务器可能会像这样为会议返回 JSON:

会议:

{
    id: '10',
    purpose: 'Code review',
    time: <timestamp>,
    attendees: [ 501, 532 ]
}

人物:

{ id: 501, name: 'Kermit', email: 'kermit@thefrog.com' }

模型可以这样定义:

Ext.define('Person', {
    extend: 'Ext.data.Model',
    fields: ['id', 'name', 'email'],
    proxy: {
        type: 'rest',
        url : 'data/people',
        reader: { type: 'json' }
    }
});

Ext.define('Meeting', {
    extend: 'Ext.data.Model',
    fields: ['id', 'purpose', 'time'],
    hasMany: { model: 'Person', name: 'attendees' }
    proxy: {
        type: 'rest',
        url : 'data/meetings',
        reader: { type: 'json' }
    }
});

我知道一旦加载了会议。我可以调用 meeting.attendees() 来访问每个 Person 模型。但是,给定新的与会者 ID(例如 599),我如何将另一个人添加到会议中?是为 id 599 加载 Person 实例然后将该实例添加到“参加者”的唯一选择吗,像这样?

Meeting.load(10, {
    success: function(meeting) {

        Person.load(599, {
            success: function(person) {
                meeting.attendees().add(person);
                meeting.save();
            }
        });

    }
})

当 meeting.save() 运行时,POST 是否正确地只包含此人的 ID,像这样?

{
    id: '10',
    purpose: 'Code review',
    time: <timestamp>,
    attendees: [ 501, 532, 599 ] <-- '599' is new attendee
}

谢谢!

【问题讨论】:

  • 您可能应该为此使用多对多关系,因为一个人可以参加很多会议,而会议可以有很多人。 id 的列表、数组等是一件坏事。
  • 感谢您的意见。也就是说,这只是一个简单的类比。实际上,关联是真正的一对多,并且数据库 (MongoDB) 的首选方法是不使用 ID 数组。但重点。
  • 这是一篇关于为使 EXT JS 4 更好地处理文档数据库所做的工作的文章。 sencha.com/forum/…我使用的是 Sencha Touch 的补丁版本和 CouchDB。

标签: extjs extjs4


【解决方案1】:

说实话……联想最适合阅读。编辑关联模型并不是最好的,因为无法配置编写器或任何东西。对于 UI,是的,将一个新模型添加到您从参加者()获得的商店,但您还需要将其发送回服务器。

【讨论】:

  • 所以保存会议后,不会发回任何给参加者()的内容?
  • 正确,除非您将名为参加者的字段添加到您的会议模型并手动处理更新数组。 ExtJS 不能很好地处理非规范化数据,它需要典型的规范化数据库结构。
猜你喜欢
  • 2012-05-02
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多