{ "event": "", "opid": "", "data": { <data object> } }
npm i node-static websocket
var http = require("http") ,port = 8008 // ./static ,StaticServer = new(require('node-static').Server)(__dirname + '/static') ,WebSocketServer = require('websocket').server; // http- var server = http.createServer(function(req, res) { // http- StaticServer.serv(req, res) }) // server.listen(8008, function() { console.log((new Date()) + ' Server is listening on port 8008'); }); // websocket var wsServer = new WebSocketServer({ // http- httpServer: server, // , // - autoAcceptConnections: false }); // - wsServer.on('request', function(request) { wsRequestListener(request) }); // var wsRequestListener = function(request) { var conn; try { // conn = request.accept('ws-my-protocol', request.origin); } catch(e) { /* */} // conn.on('message', function(message) { wsOnMessage(conn, message); }); // conn.on('close', function(reasonCode, description) { wsOnClose(conn, reasonCode, description); }); } // var wsOnMessage = function(conn, message) { } // var wsOnClose = function(conn, reasonCode, description) { }
... // var wsOnMessage = function(conn, message) { var request; // try { request = JSON.parse(message.utf8Data); } catch(e) { console.log('Error') return; } if(request && request.data) { // if(!!this[request.data.model] && !!this[request.data.model][request.data.action]) { // this[request.data.model][request.data.action](request.data, function(responseData) { // , // // // scope - - (store) // opid - responseData.scope = request.data.scope; if(request.opid) responseData.opid = request.opid // conn.sendUTF(JSON.stringify({event: request.event, data: responseData})) }) } } } ...
... // gridDataModel = { // // data - (, , ..) // cb - , read: function(data, cb) { cb({ list: [{ Author: 'Author1', Title: 'Title1', Manufacturer: 'Manufacturer1', ProductGroup: 'ProductGroup1', DetailPageURL: 'DetailPageURL1' },{ Author: 'Author2', Title: 'Title2', Manufacturer: 'Manufacturer2', ProductGroup: 'ProductGroup2', DetailPageURL: 'DetailPageURL2' }], total: 2 }) } } ...
Ext.Loader.setConfig({ enabled: true, paths: { 'Ext.ux': 'src/ux' } }); Ext.onReady(function(){ // var protocol = location.protocol == 'https:'? 'wss':'ws'; // - var WS = Ext.create('Ext.ux.WebSocket', { url: protocol + "://" + location.host + "/" , protocol: "ws-my-protocol", communicationType: 'event' }); var proxy = Ext.create('Ext.ux.data.proxy.WebSocket',{ // store storeId: 'stor-1', // websocket: WS, // params: { model: 'gridDataModel', scope: 'stor-1' }, // reader: { type: 'json', rootProperty: 'list', totalProperty: 'total', successProperty: 'success' }, simpleSortMode: true, filterParam: 'query', remoteFilter: true }); // Ext.define('Book',{ extend: 'Ext.data.Model', fields: [ 'Author', 'Title', 'Manufacturer', 'ProductGroup', 'DetailPageURL' ] }); // data store var store = Ext.create('Ext.data.Store', { id: 'stor-1', model: 'Book', proxy: proxy }); // gridpanel Ext.create('Ext.grid.Panel', { title: 'Book List', renderTo: 'binding-example', store: store, bufferedRenderer: false, width: 580, height: 400, columns: [ {text: "Author", width: 120, dataIndex: 'Author', sortable: true}, {text: "Title", flex: 1, dataIndex: 'Title', sortable: true}, {text: "Manufacturer", width: 125, dataIndex: 'Manufacturer', sortable: true}, {text: "Product Group", width: 125, dataIndex: 'ProductGroup', sortable: true} ], forceFit: true, height:210, split: true, region: 'north' }); // . // 0.1 var loadData = function() { if(WS.ws.readyState) { store.load(); } else { setTimeout(function() {loadData()}, 100) } } loadData() });
<h4> {name} <i class="date">: {[Ext.Date.format(new Date(values.date_start),'dmY')]}</i> </h4> {text} <tpl if="isCommentCreated"> . </tpl> <h4></h4> <tpl for="comments"> <p>{text}</p> </tpl> <form method="post"> <textarea rows="5" cols="50" name="comment"></textarea><br> <button type="submit"></button> </form>
Ext.define('Crm.site.news.controller.News',{ extend: "Core.Controller" ... ,showOne: function(params, cb) { var me = this ,out = {} // ,commentsModel = Ext.create('Crm.modules.comments.model.CommentsModel', { scope: me }); [ function(next) { // "comment" // if(params.gpc.comment) { commentsModel.write({ pid: params.pageData.page, // text: params.gpc.comment // }, function() { next(true) // }, {add: true}); // -- } else next(false) // } ,function(isCommentCreated, next) { out.isCommentCreated = isCommentCreated; // // commentsModel.getData({ filters: [{property: 'pid', value: params.pageData.page}] }, function(data) { out.comments = data.list; next() }) } ,function(next) { // Ext.create('Crm.modules.news.model.NewsModel', { scope: me }).getData({ filters: [{property: '_id', value: params.pageData.page}] }, function(data) { if(data && data.list && data.list[0]) out = Ext.merge(out, data.list[0]) me.tplApply('.one', out, cb) }); } ].runEach() } ...
Ext.define('Crm.modules.comments.controller.Eventer', { extend: 'Core.controller.Controller', autorun: function() { // // 1 -- ( ) // 2 -- , // 3 -- Core.ws.subscribe('eventer', 'Crm.modules.comments.model.CommentsModel', function(eventName, data) { // eventName -- (ins, upd, del ..) if(eventName == 'ins' && confirm(' . ?')) location = '#!Crm-modules-comments-controller-Comments_' + data._id }) } });
Ext.define('Crm.modules.comments.model.EventerModel', { extend: "Core.data.DataModel" })
Source: https://habr.com/ru/post/270369/
All Articles