[EXT JS]"hasMany" association on ExtJS 4.1.1a
ExtJS uses "hasMany" association to support nested json.
However the sencha docs lacks well organized documents to guide how to use it. The coder has to test a lot to make their model work.
There is a post which pointed some extra "rules" to make the hasMany work.
http://extjs-tutorials.blogspot.co.uk/2012/05/extjs-hasmany-relationships-rules.html
In my case, I used Extjs 4.1.1a, after referencing a lot and testing a lot. I got my codes working.
I used hasMany twice, one for reading nested json from existing json file; one for loading json docs from mongodb database.
Model is defined in "model" folder in MVC architecture.
(1) Loading from mongoDB database
Ext.define('App.model.ItemPrice', {
extend : 'Ext.data.Model',
idProperty : '_id',
fields : [{
name : '_id',
type : 'string'
}, {
name : 'Category',
type : 'string'
}, {
name : 'SE',
type : 'string'
}, {
name : 'Version',
type : 'string'
}, {
name : 'Unit',
type : 'string'
}, {
name : 'Partname',
type : 'string'
}, {
name : 'OTC',
type : 'Number'
}, {
name : 'MC',
type : 'Number'
}, {
name : 'Currency',
type : 'string'
}],
hasMany : {
name : 'Attributes',
model : 'App.model.ItemAttribute',
associationKey : 'Attributes'
},
proxy : {
type : 'rest',
url : '/itemprices',
reader : {
type : 'json',
root : 'prices',
successProperty : 'success'
},
writer : Ext.create('Ext.data.writer.DeepJson')
} });
Ext.define('App.model.ItemAttribute', {
extend : 'Ext.data.Model',
fields : [{
name : 'FieldKey',
type : 'string'
}, {
name : 'FieldValue',
type : 'string'
}]
});
Store defined:
Ext.define('App.store.ItemPrices', {
extend: 'Ext.data.Store', autoLoad: false,
autoSync: false,
model: 'App.model.ItemPrice'
});
One thing needs to be noticed: The "name" and "associationKey" are recommended to be the same, and DO NOT use "field" to be their value. I used to spend 2 hours to find the error, at last I changed "field" to other word, it worked. So I suspected "field" is a keyword which can not be used as the value of "name" and "associationKey" in hasMany.
To read from database, we still need to write the webservice which connects the database and gives API to web client. I used Node.js here.
As pointed in Extjs proxy(see "App.model.ItemPrice"), The web service is "rest", to write this I used "express" module. To implement reading from MongoDB I used "Mongoose" module.
var express = require('express'),
app = module.exports = express(); // MongoDB
var mongoose = require('mongoose'),
db = mongoose.connect('mongodb://127.0.0.1/IaaSDBG2'); //create the price info Model using the 'pricecatalogue' collection as a data-source
var PriceCatalg = mongoose.model('pricecatalogue', new mongoose.Schema({
Category: String,
SE: String,
Version : String,
Unit: String,
Partname: String,
OTC: Number,
MC: Number,
Currency: String,
Attributes: [{
FieldKey: String,
FieldValue: String
}]
}));
// Configuration
app.configure(function () {
//app.set('views', __dirname + '/views');
//app.set('view engine', 'jade');
app.use(express.bodyParser());//parse JSON into objects
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/IaaSPriceTool'));
}); app.configure('development', function () {
app.use(express.errorHandler({
dumpExceptions: true,
showStack: true
}));
}); app.configure('production', function () {
app.use(express.errorHandler());
}); // Routes
app.get('/', function (req, res) {
res.redirect('/index.html');
});
/*
PriceItem in database GET Express web service
*/
app.get('/itemprices', function (req, res) {
PriceCatalg.find({}, function (err, compntPrices) {
res.contentType('json');
res.json({
success: true,
prices: compntPrices
});
});
}); app.listen(3000);
console.log("Express server listening on port %d in %s mode", 3000, app.settings.env);
(2) Loading from file
Ext.define('App.model.AppConfig', {
extend : 'Ext.data.Model', fields : [{
name : 'VERSION',
type : 'string'
}],
hasMany : [{
name : 'COMPONENTS',
model : 'App.model.CompntConfig',
associationKey : 'COMPONENTS'
}]
});
Ext.define('App.model.CompntConfig', {
extend : 'Ext.data.Model',
fields : [{
name : 'CATEGORY',
type : 'string'
},{
name : 'SE',
type : 'string'
},{
name : 'UNIT',
type : 'string'
}],
hasMany : [{
name : 'FIELDS',
model : 'App.model.FieldConfig',
associationKey : 'FIELDS'
}],
belongsTo: 'App.model.AppConfig'
});
Ext.define('App.model.FieldConfig', {
extend : 'Ext.data.Model',
fields : [{
name : 'NAME',
type : 'string'
}, {
name : 'FULLNAME',
type : 'string'
}],
belongsTo: 'App.model.CompntConfig'
});
The store is created dynamically in the Controller.
var ConfigStore = Ext.create('Ext.data.Store', {
model : 'App.model.AppConfig',
proxy : {
type : 'ajax',
url : "./PriceCatalgJson_V2.0.json",
reader : {
type : 'json'
}
}
});
[EXT JS]"hasMany" association on ExtJS 4.1.1a的更多相关文章
- sencha ext js 6 入门
Sencha Ext JS号称是目前世界上最先进和最强大的.支持多平台多设备的JavaScript应用程序开发框架.首先看一下Ext JS的发展简史. 1 Ext JS发展简史 YUI-Ext的作者J ...
- Ext Js详解指南
什么是Ext JS 走进Ext的世界 Ext JS是一款富客户端开发框架它基于javascript.HTML和CSS开发而成,无需安装任何插件即可在常用浏览器中创建出绚丽的页面效果. 个人总结Ext ...
- [Ext JS 4] Extjs 它 initComponent 和 constructor差分
initComponent 和 constructor是什么 Extjs 提供的组件还是挺丰富的, 可是有时候需求更丰富. 当Extjs 原生的组件无法实现我们的要求的时候, 就须要扩展Extjs 的 ...
- Ext JS 6学习文档–第1章–ExtJS入门指南
Ext JS 入门指南 前言 本来我是打算自己写一个系列的 ExtJS 6 学习笔记的,因为 ExtJS 6 目前的中文学习资料还很少.google 搜索资料时找到了一本国外牛人写的关于 ExtJS ...
- 【转载】《Ext JS 4 First Look》翻译之一:新特性
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:^_^肥仔John 原文地址:http://www.cnblogs. ...
- Ext.js基础
第一章:Ext.js基础 好书推荐 Javascript设计模式 征服ajax web 2.0开发技术详解 简介 基础要求 了解HTML.CSS.熟练JS.JS的OOP.AJAX JSP/PHP/AS ...
- Ext JS - 问答
Ext JS - 问答 在下面你将可以找到关于Ext JS 的最常见问题的答复.如果没有找到您所需的答复,请访问 Ext JS 论坛或者提交一个支持申请. 如果你确信你的问题可以对本页有补充,请让我们 ...
- 《Ext JS模板与组件基本知识框架图----模板》
最近在整理Ext JS的模板和组件,在参考<Ext JS权威指南>,<Ext JS Web应用程序开发指南>,<Ext JS API>等相关书籍后才写下这篇< ...
- CDH5X 安装oozie报错To enable Oozie web console install the Ext JS library.
最近在CDH5.X 安装oozie 服务,服务安装完毕,访问oozie server ui,报如下错误: 页面提示: Oozie web console is disabled.To enable O ...
随机推荐
- 怎么给kibana加上权限?
更新:2016-05-20 09:36 通过向Elastic了解,他们目前开发的5.0版本支持更好的权限定制,粒度达到字段级别.他们预计今年就可以上线,如果你不是有一个旧版本的kibanba非要维护不 ...
- Centos下的SVN搭建
需求: 搭建SVN实现本地开发环境,方便线上代码的更新. 步骤: 1. 安装SVN服务 yum install -y subversion 2.创建SVN代码库的目录.创建版本库 mkdir -p / ...
- Cow Contest(最短路floyed传递闭包)
Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming con ...
- <Effective C++>读书摘要--Implementations<二>
<Item29> Strive for exception-safe code. 1.如下面的代码 class PrettyMenu { public: ... void changeBa ...
- pfx 证书怎么打开
其实双击就能够自动运行导入向导的 不行的话使用我的办法: 单击开始--运行--里输入mmc 然后单击文件--选择添加删除管理单元--再选择添加--拉动滚动条找到证书一项,点击添加再点击完成(不用做任何 ...
- phpcmsv9 同时调用多个栏目的文章标签
V9版本默认好像没有多栏目调用的标签,例如我用{pc:content action="lists" catid ="6,7,8,9,10" num=" ...
- MySQL、HBase、ES的特点和区别
MySQL:关系型数据库,主要面向OLTP,支持事务,支持二级索引,支持sql,支持主从.Group Replication架构模型(本文全部以Innodb为例,不涉及别的存储引擎). HBase:基 ...
- 如何在flink中传递参数
众所周知,flink作为流计算引擎,处理源源不断的数据是其本意,但是在处理数据的过程中,往往可能需要一些参数的传递,那么有哪些方法进行参数的传递?在什么时候使用?这里尝试进行简单的总结. 使用conf ...
- jquery计算器(改良版)
代码: <!Doctype html> <html> <meta charset="UTF-8"> <title>计算器</t ...
- bzoj4031-小Z的房间
题目 给一个\(n\*m\)的矩阵,每个点可能为"."或"*",有多少种方法把矩阵中的点全部连接起来,并且每两个点之间只有一条路径. 分析 题目所求的是一个矩阵 ...