extjs 4 XTemplate类关联
我正在测试ExtJS4,我偶然发现了一些东西,我似乎无法理解 我有简单的对象关联:Snapshot-hasMany->Model 现在,我尝试使用XTemplate在视图组件中显示此关联,因此我的XTemplate如下所示:extjs 4 XTemplate类关联,extjs,model,extjs4,model-associations,Extjs,Model,Extjs4,Model Associations,我正在测试ExtJS4,我偶然发现了一些东西,我似乎无法理解 我有简单的对象关联:Snapshot-hasMany->Model 现在,我尝试使用XTemplate在视图组件中显示此关联,因此我的XTemplate如下所示: Ext.create('Ext.XTemplate', '<tpl for=".">', '<div class="snapshot" id="{id}">', '<h1>{snapshot}</h1>', '<p>
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>'
);
由于ExtJS4引入了模型的概念,我已经为快照和模型创建了模型,并根据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时,没有显示任何模型,但是如果我从快照模型中删除关联,只添加另一个名为“模型”的字段,它就可以正常工作
使用关联时正确显示模型列表的最佳实践是什么?
我是否必须使用嵌套模板和自定义函数来执行此操作?好问题(+1)
现在看来,直接在XTemplate中使用关联是不可能的,因为XTemplate需要一个对象数组。(当您有关联时,这不再正确)
你有三个选择-
。apply
您可以监听store.load事件并将相关数据添加回store记录,然后模板就会工作(我使用RowExpander的rowBodyTpl完成了这项工作)
侦听器:{
加载:功能(存储、存储记录){
varⅠ,r;
对于(i=0;i,根据我最近的经验,如果你不在商店工作,你应该不会有问题。
ExtJS 4文档中的XTemplate示例工作正常(至少对我来说是这样)。您可以为这些数据添加一个模型,该示例将继续工作
我尝试通过存储区执行同样的操作。当您将store.first()数据传递给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)
}
var数据={
姓名:“汤米·梅因茨”,
标题:“首席开发人员”,
公司名称:“森查公司”,
电邮:'tommy@sencha.com',
地址:“5杯路”,
城市:“帕洛阿尔托”,
声明:“CA”,
zip:'44102',
饮料:[“咖啡”、“苏打水”、“水”],
孩子们:[{
姓名:'约书亚',
年龄:3
}, {
名字:'马修',
年龄:2
}, {
姓名:'所罗门',
年龄:0
}]
};
变量kidsModelProps={
扩展:“Ext.data.Model”,
字段:[
“姓名”,
{名称:“年龄”,类型:“int”}
]
}
Ext.define(“KidsModel”,kidsModelProps)
var datamodelProps={
扩展:“Ext.data.Model”,
字段:[
“姓名”、“职务”、“公司”、“电子邮件”、“地址”,
“城市”、“州”、“拉链”、“饮料”
],
有很多:{name:“thekids”,model:“KidsModel”},
代理:{
键入:“内存”,
读者:{
类型:“json”
}
}
}
Ext.define(“数据模型”,datamodelProps)
var kidsStore=新的Ext.data.Store({
数据:数据,
storeId:“kidsStore”,
模型:“数据模型”
})
var tpl=new Ext.XTemplate(
“名称:{Name}”,
“标题:{Title}”,
“公司:{Company}”,
“孩子:”,
'',//查询数据中的kids属性
“{name}”,
“”
);
Ext.onReady(函数(){
var thePanel=Ext.create(“Ext.panel.panel”{
html:“视口tpl测试:使用分离文件构建”,
边界:10,
身高:500,
布局:{
键入:“vbox”,
对齐:“居中”
},
renderTo:Ext.getBody(),
车身风格:“背景色:黄色”,
项目:[]
})
var someData=kidsStore.first().data
tpl.overwrite(panel.body,someData)
}
您还可以尝试(看看XTemplate存储关联的工作情况有多糟糕)在
抱歉,没有提供解决方案:(
我应该指出,从4.1开始,模型记录有一个名为getData()
的方法,如果使用getData(true)调用该方法
还将返回关联的数据。我完全同意让模板看起来像这样是很理想的。但是,实际上,很容易获得一个模板来处理关联。模型将其所有字段保存在一个名为data的属性中,并在根级别使用以下约定进行关联:associationName+'Sto因此,您需要做的就是按如下方式编写模板:
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>'
);
var template=Ext.create('Ext.XTemplate',
'',
'',
“{data.snapshot}”,
“创建:{data.Created}”,
“型号”,
'',
“{data.name}-{data.description}”,
'',
'',
'',
''
);
像@Izhaki说的那样,使用记录上的getData(true)将数据传递给模板,然后执行@Aaron所说的变化以循环数据。例如,如果模板是容器的一部分:
//...
tpl: //your tpl
data: record.getData(true)
//....
此模板片段应该可以正常工作:
'<tpl for="models">',
'<p>{name} - {description}</p>',
'</tpl>'
”,
“{name}-{description}”,
''
这是一种自作主张,我很喜欢sencha中的ORM概念,大多数语言现在都有某种ORM,我可以看到这一功能是MVC概念的一个坚实的组成部分,但我真诚地希望这一功能能够正常工作。也许下一个版本会带来这一功能。现在我想我会坚持使用models概念没有关联,因为对于我的项目来说,这将是最不痛苦的过渡模型。我同意。总体而言,ExtJS4中有很多好东西,但它在质量方面失败得很惨。(甚至文档都是inc
//...
tpl: //your tpl
data: record.getData(true)
//....
'<tpl for="models">',
'<p>{name} - {description}</p>',
'</tpl>'