11

我正在测试 extjs 4,我偶然发现了一些东西,我似乎无法弄清楚。

我有简单的对象关联:快照 - hasMany -> 模型

现在,我正在尝试使用 XTemplate 在 View 组件中显示此关联,所以我的 XTemplate 看起来像这样:

Ext.create('Ext.XTemplate',
'<tpl for=".">',
'<div class="snapshot" id="{id}">',
'<h1>{snapshot}</h1>',
'<p><span class="label">Created: </span>{dateString}</p>',
'<p><span class="label">Models</span></p>',
'<tpl for="models">',
'<p>{name}  - {description}</p>',
'</tpl>',
'</div>',
'</tpl>',
'<div class="x-clear bottompad"></div>'
);

我的 JSON 响应如下所示(仅显示“快照”节点):

    {
        "id": 1,
        "snapshot": "Snapshot 1",
        "created": 1305806847000,
        "models": [
            {
                "id": 1,
                "name": "ABC",
                "description": "A B C"
            }, {

                "id": 111,
                "name": "ABCDD",
                "description": "A B C XCXC"
            }
        ]
    }

由于 extjs 4 引入了模型的概念,我已经为 Snapshot 和 Model 创建了模型,并根据 API 文档创建了关联。

快照模型:

Ext.define('Snapshot', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id', type: 'int'},
        'snapshot',
        {name: 'created',type: 'date', dateFormat: 'time' }

    ],
    associations:[
      {type: 'hasMany', model: 'Model', name: 'models'}  
    ],
    idProperty: 'id'
});

模型模型;P

Ext.define('Model', {
    extend: 'Ext.data.Model',
    belongsTo: 'Snapshot',
    fields: [
        { name: 'id',  type: 'int' },
        { name: 'snapshot_id', type: 'int' },            
        'name',
        'description'
    ],
    idProperty: 'id'
});

这就是我的问题所在 - 当我使用此设置时,执行 XTemplate 时不会显示我的模型,但是如果我从快照模型中删除关联并添加另一个名为“模型”的字段,它就可以正常工作。

使用关联时正确显示模型列表的最佳做法是什么?我是否必须使用嵌套模板和自定义函数来执行此操作?

4

6 回答 6

7

好问题(+1)

似乎不可能(今天)直接在 XTemplate 中使用关联,因为 XTemplate 需要对象数组。(当你有关联时,这不再是真的)

你有三个选择——

  1. 摆脱你提到的联想。(“听起来”不太好,但会起作用)
  2. 如果您有使用模板的数据视图,请覆盖Ext.view.AbstractView.prepareData并从您的模型创建对象数组
  3. 在调用 apply 之前,遍历 snapshotStore.getRange() 并(重新)生成具有“models”属性的对象并将这个数组传递给.apply
于 2011-06-24T17:06:31.837 回答
3

我应该指出,从 4.1 开始,模型记录有一个名为 的方法getData(),如果调用 usinggetData( true )也将返回相关数据。

于 2013-02-20T13:42:26.057 回答
2

我完全同意让模板看起来像这样是理想的。然而,实际上很容易得到一个模板来做你想做的事情。模型将其所有字段保存在根级别的称为数据和关联的属性中,约定为:associationName+'Store'。因此,您需要做的就是编写您的模板,如下所示:

var template = Ext.create('Ext.XTemplate',
    '<tpl for=".">',
        '<div class="snapshot" id="{data.id}">',
            '<h1>{data.snapshot}</h1>',
            '<p><span class="label">Created: </span>{data.created}</p>',
            '<p><span class="label">Models</span></p>',
            '<tpl for="modelsStore">',
                '<p>{data.name}  - {data.description}</p>',
            '</tpl>',
        '</div>',
    '</tpl>',
    '<div class="x-clear bottompad"></div>'
);
于 2013-03-07T20:51:10.303 回答
0

您可以监听 store.load 事件并将关联的数据添加回存储记录,然后模板将起作用(我使用 RowExpander 的 rowBodyTpl 完成了此操作)。

listeners: {
    load: function(store,storeRecs) {
        var i,r;
        for (i=0;i<storeRecs.length;i++) {
            r = storeRecs[i];
            r.data.subItem = r.getAssociatedData().subItem;
        }
    }
}
于 2011-07-15T14:19:08.467 回答
0

就像@Izhaki 说的那样,在记录上使用 getData(true) 将数据传递给模板,然后对@Aaron 所说的做一个变体来遍历数据。例如,如果模板是容器的一部分:

 //...
 tpl: //your tpl
 data: record.getData(true)
 //....

此模板片段应该可以正常工作:

 '<tpl for="models">',
 '<p>{name}  - {description}</p>',
 '</tpl>'
于 2013-04-24T15:04:02.463 回答
-1

根据我最近的经验,如果你不通过商店工作,你应该不会有问题。ExtJS 4 文档中的 XTemplate 示例工作正常(至少对我而言)。您可以为这些数据添加一个模型,该示例将继续运行。

我试图通过商店做同样的事情。当您将 store.first().data 传递给 overwrite(...) XTemplate 方法时,关联不在该结构中。您可以检查以下代码:

var data = {
    name : 'Tommy Maintz',
    title : 'Lead Developer',
    company : 'Sencha Inc.',
    email : 'tommy@sencha.com',
    address : '5 Cups Drive',
    city : 'Palo Alto',
    state : 'CA',
    zip : '44102',
    drinks : ['Coffee', 'Soda', 'Water'],
    kids : [{
                name : 'Joshua',
                age : 3
            }, {
                name : 'Matthew',
                age : 2
            }, {
                name : 'Solomon',
                age : 0
            }]
};



var kidsModelProps = {
    extend: "Ext.data.Model",
    fields: [
        "name",
        {name: "age", type: "int"}
    ]
}
Ext.define ("KidsModel", kidsModelProps)

var datamodelProps = {
    extend: "Ext.data.Model",
    fields: [
        "name", "title", "company", "email", "address",
        "city", "state", "zip", "drinks"
    ],

    hasMany: {name: "thekids", model: "KidsModel"},

    proxy: {
        type: "memory",
        reader: {
            type: "json"
        }
    }
}
Ext.define ("DataModel", datamodelProps)


var kidsStore = new Ext.data.Store({
    data: data,
    storeId: "kidsStore",
    model: "DataModel"

})

var tpl = new Ext.XTemplate(
    '<p>Name: {name}</p>',
    '<p>Title: {title}</p>',
    '<p>Company: {company}</p>',
    '<p>Kids: ',
    '<tpl for="kids">',     // interrogate the kids property within the data
        '<p>{name}</p>',
    '</tpl></p>'
);

Ext.onReady(function () {
    var thePanel = Ext.create ("Ext.panel.Panel", {
        html: "<b>Viewport tpl-test: build with separated files</b>",
        border: 10,
        height: 500,
        layout: {
            type: 'vbox',
            align: 'center'
        },
        renderTo: Ext.getBody(),
        bodyStyle: "background-color: yellow",

        items: []

    })
    var someData = kidsStore.first().data
    tpl.overwrite (thePanel.body, someData)
}

您也可以在http://www.sencha.com/forum/showthread.php?127320-FIXED-EXTJSIV-242-multiple-HasMany-association-conflict-尝试(查看 XTemplate-Store-Associations 的工作情况)在 XTemplate中。

抱歉没有提供解决方案:(

威利

于 2011-08-11T16:16:38.513 回答