我当前的问题涉及在员工详细信息页面中显示与员工部门相关的ExtJS组合框中的初始值。
该页面通过PHP检索员工信息,因此所有对员工的引用都是通过PHP echo完成的(该站点使用CodeIgniter,这可能会使一些人感到困惑;它只是简化了一些输入,但工作方式与正常相同) PHP),即
var formPanel = Ext.create('Ext.form.Panel', {
title: 'User Details',
width: 300,
renderTo: Ext.get('details'),
store: userStore,
defaultType: 'textfield',
items:
[
{
fieldLabel:'User Name',
name: 'UserName',
allowBlank: false,
value: '<?php echo $Employee->UserName; ?>'
},
//More details in similar format etc.
]
});
部门有一个部门,通过组合框处理,列出所有部门;没有什么花哨的(我相信),它只是列出了所有部门:
Ext.define('DeptModel', {
extend: 'Ext.data.Model',
fields: [
{name:'Id', type: 'int'},
{name:'Name', type: 'string'}
]
});
var deptStore = Ext.create('Ext.data.Store', {
model:'DeptModel',
autoload: true,
proxy: {
// load using HTTP
type: 'ajax',
url: '<?= $site_url ?>Settings/JSON/Departments',
reader: {
type: 'json',
model: 'DeptModel'
}
}
});
上面的formPanel引用了comboBox中的deptModel / deptStore:
{
fieldLabel:'Department',
xtype:'combo',
name:'Department',
forceSelection: true,
typeAhead: true,
allowBlank: false,
emptyText: 'Choose a Department',
store: deptStore,
displayField: 'Name',
valueField: 'Id'
}
上面的组合框正确呈现并提供所有部门。然而,试图用值初始化组合框并没有奏效,从组合框中没有变化到创建停止页面渲染的错误。我看过以下内容:
value: 5 // or any integer
value: '5' // or any string
value: <?php echo $Employee->DepartmentId ?> // or any PHP reference like those that work for the textfields e.g. the User Name above - DepartmentId has been checked to be an integer
value: '<?php echo $Employee->DepartmentId ?>' // stringifying the PHP reference
value: 'Accounts'
我还看了很多关于渲染后加载商店的帖子,设置商店加载的值,设置渲染值,在formPanel代码之前设置值;坦率地说,没有人工作过,而且大多数人都把价值设定在列表中的第一个,而不是处理我的特定问题。
理想情况下,我想简单说明
value: <?php echo $Employee->DepartmentId ?>
在页面加载时,当员工的详细信息显示在表单中时,让组合框显示相关部门(即“帐户”)。
我哪里错了?为什么value: {value}
在实践中没有做任何事情?任何人都可以提供关于将组合框插入到formPanel中的正确形式的简单解释,如果当前实现在某种程度上不正确,那么允许在页面加载时拾取所述组合框中的初始值吗?
答案 0 :(得分:1)
<强> JsonStore:强>
var articleMain = new Ext.data.JsonStore({
model: 'ArticleMainGroup',
autoLoad: true,
proxy: {
type: 'ajax',
url: '<?php echo base_url() ?>dashboard/create',
extraParams: {
type: 'article_group_main'
},
reader: {
type: 'json',
root: 'articleMainGroup',
idProperty: 'ART_GROUP_ID'
}
}
});
数据模型:
Ext.define('ArticleMainGroup', {
extend: 'Ext.data.Model',
fields: [
{name: 'ART_GROUP_ID', type: 'int'},
{name: 'WHG', type: 'int'},
{name: 'WHG_BEZ', type: 'string'}
]
});
<强>控制器:强>
public function create()
{
$type = $this->input->get('type', TRUE);
// this parameter comes from ExtJS Extraparam
switch ($type)
{
case 'dnr_type':
$data = $this->dnr->get_dnr_type();
exit(json_encode($data));
case 'dnr_definition':
$para = $this->input->get('dnrtype', TRUE);
$data = $this->dnr->get_dnr_definition($para);
exit(json_encode($data));
case 'article_group_main':
$data = $this->dnr->get_article_group_main();
exit(json_encode($data));
<强>型号:强>
public function get_article_group_main()
{
$sql = $this->db->query('SELECT ART_GROUP_ID, WHG, CONCAT_WS(" - ", WHG, WHG_BEZ) AS WHG_BEZ FROM MD_ARTICLE_GROUP GROUP BY WHG_BEZ ORDER BY WHG');
return array('articleMainGroup' => $sql->result_array());
}
以下是您的要求:
{
fieldLabel:'Department',
xtype:'combo',
name:'Department',
forceSelection: true,
typeAhead: true,
allowBlank: false,
emptyText: 'Choose a Department',
store: deptStore,
displayField: 'Name',
valueField: 'Id',
id: 'cmb-department'
}
// Add a listener to the combobox before store load
var combo = Ext.getCmp('cmb-department');
var cmbStore = combo.store;
cmbStore.on('load', function() {
// setValue(777) // here, 777 is unique value that available in the store
combo.setValue(<?php echo $Employee->DepartmentId ?>)
})
答案 1 :(得分:0)
我会尽力帮助你,但你应该纠正一些错误。例如,您创建了如下数据模型:
Ext.define('DeptModel', {
extend: 'Ext.data.Model',
proxy: {
type: 'ajax',
reader: 'json'
},
fields: [
{name:'Id', type: 'int'},
{name:'Name', type: 'string'}
]
});
但是,数据模型应该是:
Ext.define('DeptModel', {
extend: 'Ext.data.Model',
fields: [
{name: 'Id', type: 'int'},
...
]
});
因此,您应该在商店配置中定义代理属性,而不是数据模型!原因是商店与服务器端交互,数据模型只是对数据建模。
var deptStore = new Ext.data.JsonStore({
model: 'DeptModel',
proxy: {
type: 'ajax',
url: '<?php echo base_url() ?>Settings/JSON/Departments',
reader: {
type: 'json',
root: 'deptList',
idProperty: 'DEP_ID'
}
}
});
在这里,我定义了一个简单的商店。您必须注意root
和idProperty
属性。你应该给出一个Json对象的名称,如下所示:
// return value from model
$sql = $this->db->query('SELECT DEP_ID, ......');
return array('deptList' => $sql->result_array());
// return value from controller
$data = $this->db->get_dept_list($arg);
echo json_encode('$data');
此外,idProperty
很重要,它应该是唯一值,以消除价值冲突。
以下是我的应用的示例屏幕截图。如您所见,当用户从DNR TİPİ
中选择一个值时,app会自动填充ÌNDİRİM TİPİNİ SEÇİNİZ
组合框!
在屏幕截图中,discDetail
等于deptList
。