ExtJS/Javascript:将子模型添加到父模型,在网格上呈现

Posted

技术标签:

【中文标题】ExtJS/Javascript:将子模型添加到父模型,在网格上呈现【英文标题】:ExtJS/Javascript: adding a child Model to a parent Model, rendering this on a grid 【发布时间】:2018-08-24 05:41:58 【问题描述】:

短版: 我有一个子模型,我需要将它添加到父模型中,然后添加到商店并在网格中渲染它,现在当我渲染它时,它只显示来自父模型的数据而不是子模型。 在我的控制器中,我认为问题出在第 51 行附近:我不知道是否有其他方法可以做到这一点,

company.set('employees',employees);

如果我对模型的数据进行硬编码,子 ('Company' hasMany -> 'Employee') 它在网格中呈现良好。我试图模仿的模型数据如下

data:'items':[
    'col4': 'Dunder Miflin',  "col5":"A paper company",  "col6":"The Office", 
    "count" : 2,
    "employees": ['col1': 'Michael Scott',  "col2":"michael@dundermiflin.com",  "col3":"555-111-1224" ,
                  'col1': 'Dwight Schrute',  "col2":"dwight@dundermiflin.com",  "col3":"555-222-1234" ]
   ,
    'col4': 'Athlead',  "col5":"Sports marketing company",  "col6":"The Office", 
     "count": 1,
         "employees": ['col1': 'Jim Halpert',  "col2":"jim@athlead.com",  "col3":"555-222-4444"]
   

]

小提琴:https://fiddle.sencha.com/#view/editor&fiddle/2efb 应用代码在 Assets/app/ 下

当你加载小提琴时,第二个网格已经有 2 行,这是 MainStore2 中的硬编码数据。

在顶部网格标题中,有一个按钮'clickMe',点击它会从MainStore(grid1的存储)读取记录并按公司分组并加载col4,5,6为公司模型和 col1,2,3 作为子模型 Employee 并将员工数组添加到公司模型中。因此,在单击按钮时,它将在下方网格中再添加两条记录,此处将显示 col4、5、6,但是当您展开(左侧的 + - 图标)时,它不会显示与第 1 行和第 2 行不同的子员工行。这就是我的问题所在。将子模型数组添加到父模型。 最后在 clickMe 事件之后,第 3 行和第 4 行应该与第 1 行和第 2 行相同。

非常感谢任何帮助或指点。

详细版本:(仅当您需要更清楚我的问题时阅读)

小提琴:https://fiddle.sencha.com/#view/editor&fiddle/2efb 应用代码在 Assets/app/ 下

我在上面的网格中有 3 行,它有两家公司,Dunder Miflin 和 Athlead。 col4

点击按钮(标题中的'clickMe')它将读取此网格存储,并按公司(col4)分组,

按 col4 过滤,

1) 我创建了一个 'Company' 模型的实例,将 col4,5,6 填充到它,这将分别是 Dunder Miflin、A Paper Company 和 The office。

2) 循环遍历记录(将只有 2 行),创建 'Employee' 模型数组并将 col1,2,3 添加到其中,并将此员工数组添加到 Company 模型作为其子模型。这个数组会有,

[迈克尔·斯科特,他的电子邮件,他的电话号码,

Dwight Schrute,他的电子邮件,他的电话号码]

在第二个过滤器上,与上述相同,但不同的公司 (Athlead) 和一名员工 (Jim)。

现在将这两个公司添加到一个数组中,并将这个公司数组添加到与较低网格相关的存储中。问题是它显示的是公司而不是员工。最后在 clickMe 事件之后,第 3 行和第 4 行应该与第 1 行和第 2 行相同。

上述算法的伪代码:

var companies = [];

Loop begin:
   var  company=Ext.create('TestUI.model.Company', record.data);
  var employees = [];
   var counter=0;

  //store1 filterByCol4.
  store1.each(function(record)
     var employeesModel = Ext.create('TestUI.model.Employee', record.data);
     employees.push(employeesModel.data);
 );
  company.set('employees',employees);
  companies.push(company);
loop END;

store2.add(companies);
store2.sync();

非常感谢任何帮助或指点。

【问题讨论】:

【参考方案1】:

最后通过试验 n 错误想出了如何将子模型数组添加到父模型。

“公司”模型是我的父母。 hasMany 与子模型 'Employee' 的关系

Ext.define('TestUI.model.Company', 
    extend    : 'Ext.data.Model',
    fields  : [
        name: 'col4',        type: 'string',
        name: 'col5',        type: 'string',
        name: 'col6',        type: 'string',
        name: 'count',        type: 'int'
    ]
    ,hasMany: [
         model: 'TestUI.model.Employee',   name: 'employees'
     ],
     proxy: 
        type: 'memory',
        reader: 
            type: 'json',
            root: 'items'
        
    
);

Ext.define('TestUI.model.Employee', 
    extend    : 'Ext.data.Model',
    fields  : [
        name: 'col1',        type: 'string',
        name: 'col2',          type: 'string',
        name: 'col3',        type: 'string'
    ],

     proxy: 
        type: 'memory',
        reader: 
            type: 'json',
            root: 'employees'
        
    
);

神奇的线是:

company.employees().add(employees);

伪代码:

Loop through records and create employee model and add to employee array: 
   var employeesModel = Ext.create('TestUI.model.Employee', record.data);
   employees.push(employeesModel);

end Loop
//create Company model and add array employees to Company.
   var company=Ext.create('TestUI.model.Company', record.data);
   company.employees().add(employees);

其他变化是我已将代理从商店移动到公司和员工模型。

更新的工作小提琴:https://fiddle.sencha.com/#view/editor&fiddle/2efb

【讨论】:

以上是关于ExtJS/Javascript:将子模型添加到父模型,在网格上呈现的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 6:将子对象添加到父列表与将子对象的导航属性设置为父对象

实体框架代码优先 - 通过主键将子实体添加到父实体

如何将子 ViewController 的视图添加到父 View 控制器的子视图中?

实现 TComponentEditor 的自定义 Firemonkey 组件。在设计时将子控件添加到父控件

怎么用js代码复制父标签底下子标签以及样式,再将子标签加入到父标签中

UIViewAutoresizingMask 将子视图宽度扩展到父视图之外