投放本站广告请联系:
extjscn#126.com
NodeJS 和 ExtJS
最近在看一些extjs和nodejs的东西,就试着将其结合着使用下。
1.新建express项目
首先我们新建一个express的项目,可以参照Web Development With Express。
express -e extjs-demo cd extjs-demo sudo npm install
增加数据库支持
sudo npm install mysql
连接数据库
var mysql = require('mysql');
var connection = mysql.createConnection({
    host : 'localhost',
    port : 3306,
    database : 'blog',
    user : 'root',
    password : 'yourpassword'
});
connection.connect();
module.exports = connection;
var mysql = require('./db');
Article.get = function get(query, callback){
  var sql = 'SELECT * FROM `articles`' + (query ? (' WHERE ' + query) : '')
  mysql.query(sql, function(err, rows, fields) {
    if(err){
      callback(err);
    }
    callback(err, rows);
  });
};
这里只稍微提下,具体可参见extjs-demo。
2.引入ExtJS
我们可以从ExtJS官网下载开发包,我这只取了其中的几个文件: * resources/ ExtJS所有的css定义和主题都在里面 * ext-all.js extjs的核心组件 * ext-lang-zh_CN.js ExtJS的中文化部件(选用)
修改我们的主页,加载ExtJS
<head>
  <link rel="stylesheet" type="text/css" href="/javascripts/extjs/resources/css/ext-all.css" />
  <script type="text/javascript" src="/javascripts/extjs/ext-all.js"></script>
  <script type="text/javascript" src="/javascripts/extjs/ext-lang-zh_CN.js"></script>
  <script>
    Ext.Loader.setConfig({
      enabled: true
    });
  </script>
  <script type="text/javascript" src="/javascripts/app.js"> </script>
</head>
Ext.application({
  name: "demo",
  appFolder: "/javascripts/app",
  launch: function () {
    Ext.create('Ext.container.Viewport', {
      layout: 'fit',
      items: [{
        xtype: 'panel',
        title: 'Demo for Extjs',
        html: 'you can see demo here'
      }]
    });
  }
});
这样启动之后就能看到extjs的界面了,当然加载的extjs可能有些多,如果有经验的同学可以指点下,还有哪些东西也可以将其去掉(刚接触,要是犯了比较白的错误,希望能指出,也好学习下,哈哈)。
3.ExtJS的MVC
参照ExtJS官方的说明,文件结构如下定义
--app --controller --model --store --view
加入controller和view
Ext.application({
  name: "demo",
  appFolder: "/javascripts/app",
  controllers: ['Articles'],  //This is somewhat different with the previous
  launch: function () {
    Ext.create('Ext.container.Viewport', {
      layout: 'fit',
      items: [{
        xtype: 'panel',
        title: 'Demo for Extjs',
        items: [{
          xtype: 'articleseditor'  //This is somewhat different with the previous
        }]
      }]
    });
  }
});
这里通过controllers: [‘Articles’]调用对应的controller
Ext.define("Demo.controller.Articles", {
  extend: 'Ext.app.Controller',
  views: ['Articles'],   //这里再取调用view
  init: function () {
    this.control({
      'articleseditor': {
        render: this.onEditorRender
      }
    });
  },
  onEditorRender: function () {
    console.log("articles editor was rendered");
  }
});
Ext.define('Demo.view.Articles', {
  extend: 'Ext.grid.Panel',
  id: "articles_editor",
  alias: 'widget.articleseditor',
  initComponent: function () {
    //hardcoded store with static data:
    this.store = {
      fields: ['title', 'year'],
      data: [{
        title: 'The Matrix',
        year: '1999'
      }, {
        title: 'Star Wars: Return of the Jedi',
        year: '1983'
      }]
    };
    this.callParent(arguments);
  }
});
这里先放点假数据呈现下,至此你打开界面的时候就能看到相应的数据显示在页面上
数据放在页面上肯定是不合理的,一般model中定义数据的结构,store存取数据记录
在controller中新增
models: ['Articles'], stores: ['Articles'],
view中修改为
Ext.define('Demo.view.Articles', {
  extend: 'Ext.grid.Panel',
  id: "articles_editor",
  alias: 'widget.articleseditor',
  store: 'Articles',
  initComponent: function () {
    this.columns = [{
      header: '作者',
      dataIndex: 'user',
      flex: 1
    }, {
      header: '标题',
      dataIndex: 'title',
      flex: 1
    }, {
      header: '内容',
      dataIndex: 'content',
      flex: 1
    }, {
      header: '发生时间',
      dataIndex: 'happened_at',
      xtype : 'datecolumn',
      format : 'Y年m月d日',
      flex: 1
    }];
    this.callParent(arguments);
  }
});
model中定义数据类型
Ext.define('Demo.model.Articles', {
  extend: 'Ext.data.Model',
  fields: [
    {
      name: 'id',
      type: 'string'
    }, {
      name: 'user',
      type: 'string'
    }, {
      name: 'title',
      type: 'string'
    }, {
      name: 'content',
      type: 'string'
    }, {
      name: 'happened_at',
      type: 'string'
    }]
});
store中存取数据记录
Ext.define('Demo.store.Articles', {
  extend: 'Ext.data.Store',
  model: 'Demo.model.Articles',
  data: [{
    id: '1',
    user: 'tom',
    title: 'The Matrix',
    content: 'hello Tom',
    happened_at: '2013-6-1'
  }]
});
当然至此为止我们还没进行数据交互的部分,那接下来我们就试试跟后台的交互
4.数据交互
在服务器段做下相应的json数据的准备
var Article = require('../models/article.js');
module.exports = function (app) {
  app.get('/articles', function(req, res) {
    Article.get(null, function(err, articles){
      if(err){
        articles = [];
      }
      res.contentType('json');
      res.json({success: true, articles: articles});
    });
  });
}
通过proxy从服务器端的”/articles”中获取json数据
这样就能在网页上显示数据库中的数据.
这里的代码可以参考https://github.com/caok/extjs-demo
参考:
http://docs.sencha.com/extjs/4.1.3/#!/guide/editable_grid
http://docs.sencha.com/extjs/4.1.3/#!/guide/editable_grid_pt2
作者: Caok
原文: http://caok1231.com/blog/2013/06/18/nodejs-and-extjs/
- 要发表评论,请先登录


