- Angularjs
- DataBoom
æ ŒçŽåº«ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®äž»ãªéšåãæžãçŽããŠããããäœã§ãäœãé£ã¹ãŠããã®ããææ¡ããããšããŸãã ãããã£ãŠãæåã®éšåã§ã¯ãè§åºŠãæ¢çŽ¢ããæ¹æ³ã§ããªãã®æ°ã«å«ãŸããèœãšãç©Žã«è¡çªããªãããã«ãã³ãŒã¹ããã詳现ã«èª¬æããããšããŸãã
ããŠã第2éšã§ã¯ãDataBoomã䜿çšããŠãå ã®ã²ãŒã ã®ããã«ã€ãã³ãã®çŽ æŽããããã¥ãŒãäœæããŸãïŒHeartStoneã®ã€ã¡ãŒãžãšäŒŒãŠããããšãæãåºããŸãïŒã ä»åŸãphpãµãŒããŒãå®å šã«åé€ããDataboomã«å®å šã«åãæ¿ãããšã¯èšããŸãããããã¯ãŸã£ããå¥ã®èšäºã§ã...
Angularjs
è§åºŠã®ããã¢ããªã±ãŒã·ã§ã³ãåæåããã«ã¯ãã©ã€ãã©ãªãæ¥ç¶ããŠjsãã¡ã€ã«ã«ã¢ãžã¥ãŒã«ãäœæããã ãã§ã¯äžååã§ãããšããäºå®ããå§ãã䟡å€ããããŸãã Angularã䜿çšããã«ã¯ãhtmlãã¡ã€ã«ããã¥ãŒãšããŠäœ¿çšããå¿ èŠããããŸããããã¯ãç§ã®æèŠã§ã¯ããã¥ãŒãšã³ã³ãããŒã©ãŒãåé¢ããã®ã«é©ããŠããŸãã
æ ŒçŽåº«ã«ã¯ããã£ã¬ã¯ãã£ããªã©ã®ãšã³ãã£ãã£ããããŸã-ç¹å¥ãªhtmlå±æ§ã§ãããããã®1ã€ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ãåæåããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯ããŒãžå šäœãã«ããŒããããšã¯ã§ããŸããããããŒãžäžã®åå¥ã®ãããã¯ã®ã¿ãã«ããŒããå ŽåããããŸãããã¹ãŠã¯ãåæåããå Žæã«äŸåããŸãã åæåã¯ãng-appãã£ã¬ã¯ãã£ãã䜿çšããŠè¡ãããŸãã
<html ng-app>
ããã¯ããã®èŠçŽ ãšããªãŒã®äžã®ãã¹ãŠãè§åºŠã®è¡šçŸã§ããããšã瀺åããŠããŸãã ããããã¹ãŠãã³ã³ãããŒã©ãŒã®å©ããåããŠç®¡çããŸãããã³ã³ãããŒã©ãŒãåæ§ã®æ¹æ³ã§åæåããå¿ èŠããããŸãã
<div ng-controller="myController">
ã³ã³ãããŒã©ãŒã¯ã空äžã«åãäžããããšãªããã¢ãžã¥ãŒã«ã«çµã³ä»ããããŠããŸãã ã¢ããªã±ãŒã·ã§ã³èªäœãã¢ãžã¥ãŒã«ïŒã¢ããªã±ãŒã·ã§ã³ãžã®ã¡ã€ã³ãšã³ããªãã€ã³ãïŒã§ãããã¢ãžã¥ãŒã«ã®ããããã®åªäœæ§ãæå®ããã«ã¯ãng-appãã£ã¬ã¯ãã£ãã§ãã®ååãæå®ããå¿ èŠããããŸãã
<html ng-app="App">
ã¢ãžã¥ãŒã«ã¯ãè§åºŠãªããžã§ã¯ãã®ã¢ãžã¥ãŒã«ã¡ãœããã«ãã£ãŠäœæãããŸãã
angular.module(' ', ['_1'])
ããããã¢ãžã¥ãŒã«èªäœã¯ã³ã³ãããŒã©ãŒãªãã§ã¯ã»ãšãã©åœ¹ã«ç«ã¡ãŸããã ã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãã€ã³ããšããŠå®çŸ©ããã¡ã€ã³ã¢ãžã¥ãŒã«ã§ã³ã³ãããŒã©ãŒãäœæããã«ã¯ïŒããšãã°ïŒãã¢ãžã¥ãŒã«ãªããžã§ã¯ãã§ã³ã³ãããŒã©ãŒã¡ãœãããåŒã³åºãå¿ èŠããããŸãã
myModule.controller(' ', ['$scope',function($scope){ $scope.var = 'some'; $scope.foo = function(){}; }]);
$ã¹ã³ãŒããªããžã§ã¯ãã¯ãã³ã³ãããŒã©ãŒã¹ã³ãŒãã®ãã¹ãŠã®å€æ°ãšé¢æ°ãã€ãŸãããã¥ãŒã§äœ¿çšã§ãããã®ãå®çŸ©ããŸãã ãã®å Žåãhtmlãã¡ã€ã«ã§varããã³fooã䜿çšã§ããŸãã
å€æ°å€ã¯äºéäžæ¬åŒ§{{var}}ã䜿çšããŠè¡šç€ºãããŸããã€ãŸãïŒ
html
<div> {{var}} </div>
ãsomeããåºåããŸãã
ãã€ã³ãã«è¿ã
æ®ãã®åŸ®åŠãªç¹ã«ã€ããŠã¯ãäŸãæããŠããã«å¯ŸåŠããŸãã Angularã«é¢ããèšäºã¯ããã€ããããŸãããangular.ruã®ããã¥ã¡ã³ãã¯æ確ã§ã¯ãããŸããïŒå人çã«ã¯ïŒã
ã¢ããªã±ãŒã·ã§ã³ãã¢ãžã¥ãŒã«åãããšãã«æåã®èœãšãç©Žã«çŽé¢ããŸãïŒäŸãšããŠrequirejsã䜿çšïŒã ããã«ng-appãã£ã¬ã¯ãã£ããhtmlã«ç»é²ããŠãããè§åºŠã¡ãœãããšrequireã¡ãœããã䜿çšããŠã©ã€ãã©ãªãæ¥ç¶ãããšãäœãæ©èœããªãããšãããããŸãã ããã¯ãã©ã€ãã©ãªæ¥ç¶æã®DOMããªãŒããã§ã«ã³ã³ãã€ã«ãããŠããããã§ãã
ãã®ãããªå Žåãè§åºŠãªããžã§ã¯ãã«ã¯ããŒãã¹ãã©ããã¡ãœããããããŸãã
require(['domReady!'], function (document) { ng.bootstrap(document, ['App']); });
ãããã£ãŠãAppã¢ãžã¥ãŒã«ããææžåããã¢ããªã±ãŒã·ã§ã³ãžã®ãšã³ããªãã€ã³ããšããŠãã€ã³ãããŸãã
ããã¡ãã§æåã«ãªã¡ã€ã¯ããã®ã¯ã¡ãã¥ãŒã§ããã€ãŸãããã¬ã€ã€ãŒã®ãªã¹ããããå¯äžã®ã¡ãã¥ãŒã§ãã
ã³ãŒã
define(['angularControllersModule', 'User', 'Directive'],function(controllers, User, Directive){ /////////// userList controllers.controller('userlistCtrl', ['$scope',function($scope){ $scope.userlist = []; // , $scope.isMe = function(name){ // if (name == User.login) { return 'me'; }; } $scope.letsFight = function(name){ // , return Directive.run('figthRequest',name); } }]); return controllers; })
ããã§ãåãã¬ã€ã€ãŒã®æšªã«ãã察å¿ãããã¿ã³ãã¯ãªãã¯ãããšãletsFightïŒïŒïŒæŠéãžã®æåŸ ïŒãåŒã³åºãããŸãã æ ŒçŽåº«ã§ã¯ãããã¯ng-clickãã£ã¬ã¯ãã£ãã§æå®ãããŸãïŒ
<li class="{{isMe(user.name)}}" ng-repeat="user in userlist"> <span class="name">{{user.name}}</span> <span class="fightButton" ng-click="letsFight(user.name)"></span> </li>
ããŸããŸãªé¢æ°åŒã³åºãã«æ³šæããŠãã ããïŒäžæ¬åŒ§ãããšãªãã éãã¯ãäžæ¬åŒ§å ã®åŒããŠãŒã¶ãŒããã®ã¢ã¯ã·ã§ã³ãåŸ ããã«ããã«èšç®ãããããšã§ãããããã£ãŠã2çªç®ã®å Žåãé¢æ°ã¯ã¯ãªãã¯ã ãã§åŒã³åºãããå¿ èŠããããããäžæ¬åŒ§ã¯äœ¿çšããŸããã
ng-repeatãã£ã¬ã¯ãã£ãã¯ãPHPã®foreachãŸãã¯ES6ã®for ofãšåãããã«æ©èœããŸã-ãªã¹ãå ã®ãã¹ãŠã®ãªããžã§ã¯ããå埩åŠçããŸãã ãã£ã¬ã¯ãã£ãã¯<li>ã¿ã°ã§ç€ºãããŸããã€ãŸããuserlisté åã«ããèŠçŽ ãšãŸã£ããåãåæ°ã ãç¹°ãè¿ããŸãã
ããããæåã¯ãã¬ãŒã€ãŒã®ãªã¹ãã¯ç©ºã§ããããµãŒããŒããwebsocketã§ååŸããŸãã ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã©ã€ãã©ãªãã¢ãžã¥ãŒã«ãããã³ããã€ãã®åçŽãªåœä»€ã»ããïŒãã£ã¬ã¯ãã£ããšåŒã³ãŸãïŒãç°¡åã«æžãæããããããã«åé¢ããããšããŸããã
ããã«ããããã®ãã£ã¬ã¯ãã£ãïŒDirectives.jsïŒã«ã¯å¥ã®ãã³ãã©ãŒããããWebsocketsãajaxãªã©ãã©ãããã§ãååŸããååã§å¿ èŠãªãã£ã¬ã¯ãã£ããåŒã³åºãã ãã§ãã æãåçŽãªå Žåãããã¯ãã applyïŒïŒã§ããããã£ã¬ã¯ãã£ããåŒã³åºãããé åºãèšè¿°ããããŒãã«ãããŒã¿ããŒã¹ã«äœæããŸããã ã€ãŸããmyDirãšããååã®ãã£ã¬ã¯ãã£ããåŒã³åºãããšãããšãããŒãã«ã«äžèŽãããã®ãããå Žåãããã«ç€ºãããŠãããã£ã¬ã¯ãã£ããåŒã³åºãããŸããããã¯ãªã³ã¯ã®äžçš®ã§ãã ãããããã®ããŒã¹ã®ãã€ã³ãã¯ãäºåãã£ã¬ã¯ãã£ããšäºåŸãã£ã¬ã¯ãã£ãã䟿å©ã«èšå®ããããšã§ãã ã€ãŸããç¹å®ã®ãã£ã¬ã¯ãã£ããåŒã³åºãååŸã«åŒã³åºããããã®ã§ãã
ãããŠããããã®ãã£ã¬ã¯ãã£ãã¯ãã¹ãŠå¥ã®ãã©ã«ããŒã«ä¿åãããå¿ èŠãªãšãã«æ¥ç¶ããŸãïŒ
ã¢ãžã¥ãŒã«/ directive.js
define(['DB','is'],function(DB){ var path = 'Actions/'; var Directive = { run: function(directiveName, args){ var args = args || ['']; if (!is.array(args)) { args = [args] }; DB.getDerictive(directiveName, exec); function exec(directiveName){ // Directive.preAction ? if (typeof directiveName == undefined || typeof directiveName == 'string') { action = directiveName; }else{ action = directiveName.action; } Directive._apply(action,args); } }, _apply: function(actionName,args){ require([path + actionName],function(action){ action.run.apply(action,args); }); } } return Directive; })
ãµãŒããŒããwebsocketã«ãã£ãŠããã£ã¬ã¯ãã£ãåãšåŒæ°ãååŸãããã®ã¢ãžã¥ãŒã«ã䜿çšããŠåŒã³åºããŸãã
socket.onmessage = function (e){ if (typeof e.data === "string"){ var request = JSON.parse(e.data); Directive.run(request.function,request.args); }; }
åæ§ã«ã空ã®ãªã¹ãã«ãã¬ãŒã€ãŒãè¿œå ããæé ãååŸããŸãã
ã³ãŒã
define(['angularrutch'],function(angularrutch){ var action = { run: function(list){ for(key in list){ angularrutch.scopePush('userListTpl', 'userlist',{name: key}); } } } return action; })
ç§ã¯ããªããæ¢ã«è©±ããŠããååã®è§åºŠã®ããæŸèæãšã®äŸåã«ãã§ã«æ°ã¥ããŠãããšç¢ºä¿¡ããŠããŸãã ãã®ã¢ãžã¥ãŒã«ã¯ãå€éšããè§åã¢ãžã¥ãŒã«ãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã å®éãè§åºŠã³ã³ãããŒã©ãŒã®ããŒã¿ãå€æŽããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã ã¡ãœãããåŒã³åºãããããã©ã¡ãŒã¿ãŒã®å€ãæžãæãããããããšã¯ã§ããŸããã ã¢ãžã¥ãŒã«ã®è§åºŠãããå€æ°ã«å²ãåœãŠããšããŠãã$ scopeã®ã¹ã³ãŒãã¯ãŸã çŽæ¥å©çšã§ããŸããã
ãããã®ç®çã®ããã«ããã®æ§é ã䜿çšã§ããŸãïŒ
var el = document.querySelector( mySelector ); var scope = angular.element(el).scope(); scope.userlist.push(user);
ãã¹ãŠãçŽ æŽãããã$ã¹ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããŸãããããã§ã¯ããã»ã©åçŽã§ã¯ãããŸããã $ã¹ã³ãŒãããŒã¿ã¯èªç±ã«å€æŽã§ããŸããããã¥ãŒã§ã¯äœãå€æŽãããŸããã Angularã¯åã«ããªããäœããå€æŽããããšã«æ°ã¥ããã$ã¹ã³ãŒãã®ãã©ã¡ãŒã¿ãŒã®å€æŽã远跡ããŸããããç¹å®ã®ãŠãŒã¶ãŒã¢ã¯ã·ã§ã³äžã«åŒã³åºããã$ digestïŒïŒã«ãŒãã§ã®ã¿ãããè¡ããŸãã æåã§åŒã³åºãã«ã¯ãã¹ã³ãŒãã§$ applyã¡ãœãããåŒã³åºããŸãã
å€æŽãããã³ãŒã
scope.$apply(function () { scope.userlist.push(user); });
ããã§ãã¹ãŠãæŽããè¡ã£ãå€æŽã衚瀺ãããŸãã
ãã¬ã€ã€ãŒã®æãšã¢ãªãŒãã®ã«ãŒãã®ãªã¹ãã®ã³ã³ãããŒã©ãŒã«ã€ããŠã¯èª¬æããŸãããããã§ã¯ãã¹ãŠåãã§ãããã€ãã³ããã¥ãŒã®å®è£ ã«ç§»ãæ¹ãè¯ãã§ãããã
DataBoomã®ãã¥ãŒ
è€æ°ã®ã¿ã¹ã¯ãé£ç¶ããŠäžããŠïŒæ»æãæ³èµ·ãã¿ãŒã³çµäºïŒãããšããã¹ãŠãåæã«è¡ãããããã§ã¯ãªããç»é¢äžã§ãªããžã§ã¯ããã¡ãã€ãããšãããã£ãŠããŸãã
ããŒã¿ããŒã¹ã§ã¯ããã¥ãŒããŒãã«ã¯æ¬¡ã®ããã«ãªããŸãã
{"for":"user_1","motion":"opGetCard","motionId":2}, {"for":"user_2","motion":"opGetCard","motionId":1},
ã©ã®ãã¬ãŒã€ãŒãç®çã®ã¢ã¯ã·ã§ã³ã§ããããåœä»€ã®ååãããã³æ³šæã®ã¢ã¯ã·ã§ã³IDã
ãã¥ãŒãäœæããããã«ã2ã€ã®åœä»€ãäœæããŸããã1ã€ã®ããã·ã¥ã¡ãœããã䜿çšããstack.jsã¢ãžã¥ãŒã«ïŒã¹ã¿ãã¯ã¯å®éã«ã¯ãã¥ãŒã§ã¯ãããŸãããç§ã¯èšèã奜ãã§ãïŒãšDataBoomããŒã¿ããŒã¹ãšã®å¯Ÿè©±ãæ åœããDBã¢ãžã¥ãŒã«ã®ããã·ã¥ã¡ãœããïŒ
stack.js
define(['DB', 'User'],function(DB, User){ var module = { push: function(forWho, motion, expandObj) { var expandObj = expandObj || null; var motionObj = { 'for': forWho, 'motion': motion }; if (expandObj) { motionObj[expandObj.prop] = [{id:expandObj.id}]; }; DB.push('motionQueue',motionObj); } } return module; })
ãã®ãããªã€ã³ã¿ãŒãã§ã€ã¹ã®äœ¿çšã¯ç°¡åã§ãã
stack.push(User.login,'myTimerStart');
user.loginã®myTimerStartã¹ããŒãã¡ã³ããåŒã³åºããŸã
2ç§ããšã«åçŽãªsetIntervalïŒïŒé¢æ°ã䜿çšããŠåœä»€ãæœåºããŸãã
setInterval(function(){ Directive.run('getNextAction'); }, 2000);
é åºã«åŸãããã«ã¯ãã°ããŒãã«å€æ°window.motionIdãå¿ èŠã§ãããã®å€æ°ã«ã¯ãæ¢ã«è§£æ±ºãããïŒã¢ã¯ã·ã§ã³ãå®äºããŠå ã«é²ãïŒåœä»€ã®æ°ãå«ãŸããŠããŸãã getNextActionãã£ã¬ã¯ãã£ãã¯ãåãååã®ããŒã¿ããŒã¹ã¢ãžã¥ãŒã«ã¡ãœãããåŒã³åºããã³ãŒã«ããã¯ãèšè¿°ããŸãã
DB.getNextAction(User.login, this.actionStart); //
ã¯ãšãªã¯ãšãªãã€ãŸããã£ã«ã¿ãŒã䞊ã¹æ¿ããå¶éä»ãã®ã¯ãšãªã®å¯èœæ§ããããããããŒãã«ã§å¿ èŠãªåœä»€ãæ€çŽ¢ã§ããŸãã
var config = { baseHost: 'https://t014.databoom.space', baseName: 'b014' } var db = databoom(config.baseHost, config.baseName); // var filter = "(motionId gt " + window.motionId + ") and (for eq '" + forWho + "')"; // /* : eq - ne - lt - le - gt - ge - */ db.load('motionQueue',{ filter: filter, orderby: "motionId", // top: 1 // - })
ããã¬ãŒã€ãŒãããŒãã«ã«ãã®ãããªãã©ã¡ãŒã¿ãŒãå«ãã«ãŒãã眮ãããªã©ã®è€éãªæ瀺ããªããã°ããã¹ãŠãã·ã³ãã«ã«èŠããã§ãããã ããã§ãã©ã®ã«ãŒããã©ã®ãã©ã¡ãŒã¿ãŒãæã£ãŠããããç¥ãå¿ èŠããããŸãã ã¯ããããŒã¹ã®ãåŒæ°ããŸãã¯ãããããã«ãã1ã€ã®ãã£ãŒã«ããäœæããŸãã ãããæ å ±ãååŸããããã«ããŒã¿ããŒã¹ã«å¥ã®ã¯ãšãªãäœæããŸããïŒ
ãããããããšã«ãDataBoomã«ã¯ãã®ç¹ã§è§£æ±ºçããããŸã-å±éãªãã·ã§ã³ã¯ãè¿ããããªããžã§ã¯ããå¥ã®ããŒãã«ïŒãã®å Žåã¯ãããä»ãã®ããŒãã«ïŒã®ããŒã¿ã§å±éããå¿ èŠãããããšã瀺ããŸãã
å°å³è¡š
ããŒã¿ããŒã¹å ã®ãã€ã³ãã£ã³ã°èªäœã¯æ¬¡ã®ããã«ãªããŸãã
... ,"card":[{ "id": "probe"}], ...
å¥ã®ããŒãã«ã®ã¬ã³ãŒãã®IDã ãŸããè§æ¬åŒ§ã¯ããããé åã§ãããã€ãŸãããã€ã³ãã£ã³ã°ãè€æ°ã§ããå¯èœæ§ãããããšãæ確ã«ç€ºããŠããŸãã
expandåœä»€ã䜿çšããŠããŒã¿ããŒã¹ã®å¿çãå±éãããšãããŒã¿ããŒã¹ããåãã¬ã³ãŒããååŸãããŸãããªããžã§ã¯ã{"id"ïŒ "probe"}ã®ä»£ããã«ã察å¿ããããŒãã«ããidã«ããéžæã®ãªããžã§ã¯ãããããŸãã
{ id:"...", collections:[{ id: "motionQueue"}], "for":"user_1", "motion":"opPutCard", "motionId":2 card:[ { id:"probe", title:"probe", mana:1, attack:1, health:1 } ], }
ãããã«
- ã¢ã³ã®ã¥ã©ãŒã®ãã¹ãŠã®åºæ¬çãªç¥æµã¯ç¡æèã«ç解ããããšã¯ã§ãããäžå¿ èŠã«è€éã§ãã å€éšããããåãããã®ã¯é£ããã§ããç§ã¯ããã奜ãã§ã¯ãããŸããã§ããã
- ç§ã¯DataBoomå šäœã奜ãã§ããããè±èªã§ãããŸãææžåãããŠããŸãããïŒç§ãç¥ã£ãŠããéããäŒç€Ÿã¯ãã·ã¢èªã§ããïŒãå ¥åããŠããã€ãã®ããšãå匷ããªããã°ãªããŸããã