
æ©æ¥ã
ABBYY LS㯠Xeroxãšãšãã«ãææžç¿»èš³ãµãŒãã¹ã§ããXerox Easy Translator Serviceãéå§ããŸããã ãã®ãµãŒãã¹ã®ãã€ã©ã€ãã¯ãXerox MFPã§å®è¡ãããã¢ããªã±ãŒã·ã§ã³ã§ããå¿
èŠãªæ°ã®ããã¥ã¡ã³ããã¹ãã£ã³ããéžæãã38èšèªã®ãããããžã®ç¿»èš³ãåŸ
æ©ãã翻蚳ãå°å·ã§ããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ã800x480ãã¯ã»ã«ã®ã¿ããã¹ã¯ãªãŒã³ãåããXerox ConnectKeyãã¯ãããžãŒã«åºã¥ãç¹å®ã®Xerox MFPã·ãªãŒãºã§å®è¡ãããŸãã MFPã®ããŒããŠã§ã¢ã¯ç¹å®ã®ã¢ãã«ã«äŸåããŸããããšãã°ããã¹ãçšã®Xerox WorkCentre 3655ã«ã¯ã1Ghzãã¥ã¢ã«ã³ã¢ããã»ããµãš2Gbã®RAMãæèŒãããŠããŸãã é©ããããšã«ãMFPã«ã¯Webkitãã©ãŠã¶ãŒãçµã¿èŸŒãŸããŠãããã¢ããªã±ãŒã·ã§ã³ã¯AngularJS 1.3.15ã§éçºãããéåžžã®htmlã¢ããªã±ãŒã·ã§ã³ã§ãã
ãã®ãããžã§ã¯ãã«ã€ããŠã¯ããã°ã®ååã§
æžããŸãããããã®èšäºã¯ãããžã§ã¯ãã®é
åçãªæ®µéã®1ã€ãã€ãŸãXerox MFPã§ã®äœæ¥ã®ããã®AngularJSã®æé©åã«åœãŠãããŠããŸãã å®éã«å€æããããã«ãMFPãã©ãããã©ãŒã ã¯å®éã«ã¯ã¢ããªã±ãŒã·ã§ã³éçºã«é倧ãªå¶éã課ãããšã¯ãªãã1ã€ã®äŸå€ãé€ããŠãã¹ã¯ãããWebkitãã©ãŠã¶ãŒãšã»ãŒåãããã«æ©èœããŸãã
JSå®è¡çšã®htmlã¢ããªã±ãŒã·ã§ã³ã«ã¯ã3.5 Mbã®RAMã®ã¿ãå²ãåœãŠãããŸãïŒçŸæç¹ã§ã¯ãXeroxã¯ãã©ãããã©ãŒã ã®æŽæ°ãæ¢ã«ãªãªãŒã¹ããŠãããå²ãåœãŠãããã¡ã¢ãªã®ãããå€ã10 Mbã«åŒãäžããŠããŸãïŒã AngularJSã¯ãã¢ããªã±ãŒã·ã§ã³ã§ã®äœæ¥ã®æ°åã§ãããã®3.5 Mbãæ¶è²»ããçµã¿èŸŒã¿ã®MFPãã©ãŠã¶ãŒã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãã®ãããªå€§é£ãã«è¿œãã€ãããåçŽã«ã¢ããªã±ãŒã·ã§ã³ãMFPã¡ã€ã³ç»é¢ã«ããã¯ããŸããã ããã«ãXeroxã«ã¯ãMFPã§å®è¡ãããŠããã¢ããªã±ãŒã·ã§ã³ãåæããã³ãããã°ããããã®ããŒã«ããããŸããã
æåã¯äœãã§ããªãã£ãããã«èŠããŸãããïŒç¹ã«ãææ°ã®ãã©ãŠã¶ã®ãã©ãã£ãªãã£ãçŽæ¥ç¥ã£ãŠããå ŽåïŒãç¶æ³ãæ£ããè©äŸ¡ããŠãAngularJSã飌ããªãããã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªæ¶è²»ãæå°éã«æããããšã«ããŸããã 220kbã®ã³ã³ãã€ã«æžã¿ïŒgzipã§ã¯ãªãæå°åïŒJSã¢ããªã±ãŒã·ã§ã³ã³ãŒãããå§ããŠã97kbïŒAngularJSã¯56kbãä»ã¯ãã¹ãŠã³ãŒãã§ãïŒãçµäºããæªäœ¿çšã®ã³ãŒããå¯èœãªéãåé€ããããã¡ã¢ãªæ¶è²»ãæå°éã«æããããã«å€æŽããŸããã ãã®çµæã3.5 Mbã®ã¡ã¢ãªãæèŒãããã©ãããã©ãŒã ã§æ°ååéå®å®ããã¢ããªã±ãŒã·ã§ã³ãå®çŸãã10 MbãæèŒããæ°ãããã©ãããã©ãŒã ã§å®å
šã«ç Žå£ãããŸããã ç§ãã¡ã¯äœãããŸãããïŒ
HTTPãªã¯ãšã¹ã
ç§ãã¡ãããã«çŽé¢ããäž»ãªåé¡ã¯ããéããhttpãªã¯ãšã¹ãã§ããã ãããã®ãé倧床ãã¯ãéä¿¡ãããããŒã¿ã®éãéã§ã¯ãªãã$ http AngularJSãµãŒãã¹ã®ããŒãã®äžã§åãªã¯ãšã¹ãã§äœæãããæ°ããXmlHttpRequestãªããžã§ã¯ãã§æž¬å®ãããŸãã Xerox SDKã®æšå¥šã»ã¯ã·ã§ã³ã®å
Œξ
å ±ã¯ãã¢ããªã±ãŒã·ã§ã³ã§1ã€ã®XmlHttpRequestãªããžã§ã¯ãã®ã¿ã䜿çšãã1ã€ã®ãªããžã§ã¯ãã®ã¿ã䜿çšããŠãã¹ãŠã®ãªã¯ãšã¹ããé çªã«å®è¡ããããšã匷ããå§ãããŸãã
SDKã®äŸã¯éåžžã«ã·ã³ãã«ã§ãããæåéããã¢ããªã±ãŒã·ã§ã³å
šäœã«å¯Ÿãã2ã3ã®ãªã¯ãšã¹ãã§ãããååãšããŠããã®ãªããžã§ã¯ãã®ãã€ãã£ãã³ãŒã«ããã¯ã䜿çšããŠãåäžã®XmlHttpRequestãªããžã§ã¯ãããã®ãŸãŸã®åœ¢ã§äœ¿çšããããšãè€éã«ããŸããã ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããŠãŒã¶ãŒã®æ³šæãåæããéåžžã«å·§åŠãªããžãã¯ãç·šæãããŠããŸããoauthæ¿èªãã¹ãã£ã³ãŸãã¯å°å·ãéå§ããããã®MFP soapãµãŒãã¹ãžã®èŠæ±ã§ãã ããã«ãMFPãžã®èŠæ±ã¯ãç¬èªã®XmlHttpRequestãªããžã§ã¯ããäœæããSOAPãµãŒãã¹ã®xmlå¿çãæäœããã¡ãœããããã«ãããã®xmlå¿çãè§£æãããšãã«äžè¬ã«è¿œå ã®è€éããäœæããç¶æ³ãåŒãèµ·ãããXerox SDKã®ã³ãŒãã䜿çšããŠå®è¡ãããŸããAngular-wayã³ãŒããæžããŠããŸããã
ãããã£ãŠã1ã€ã®XmlHttpRequestãªããžã§ã¯ãã®å®éã®äœ¿çšã«é¢ããéåžžã®äŸã®æ¬ åŠãSDKããã®åºç¯ãªã¯ãšãªã®äœ¿çšãããã³æºã¬ã¬ã·ãŒã³ãŒãã®ãããªãæ·±å»ãªåé¡ã«çŽé¢ããŸããã ãã¹ãŠã®è€éãã«ãããããããæ¹æ³ã¯ç°¡åã§ããã$ httpãµãŒãã¹ãäœæããXerox SDKããã³ãŒããç Žæ£ããã¹ãã£ã³ãšå°å·ããµããŒãããããã«AngularãµãŒãã¹ãäœæããŸãã
äž»ãªåé¡ã®1ã€ã¯ãã«ã¹ã¿ã ãµãŒãã¹ãAngular $ httpãµãŒãã¹ãšåãããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠãã³ã³ãããŒã©ãŒã®åäœäžããã³ãã¹ãæžã¿ã®ã³ãŒããš$ httpäŸåãµãŒãã¹ãä¿åããå¿
èŠãããããšã§ãã ã¢ããªã±ãŒã·ã§ã³ã¯getããã³postãªã¯ãšã¹ãã®ã¿ã䜿çšãããããåçŽãªã¢ãããŒã·ã§ã³$ http.getïŒ...ïŒããã³$ http.postïŒ...ïŒã§ããµãŒãã¹èªäœã¯æ¬¡ã®ããã«ãªããŸãã
function ($q) { var queue = [];
ããã¯ãµãŒãã¹ã®æå°åœ¢åŒã§ããã1ã€ã®XmlHttpRequestãªããžã§ã¯ãã䜿çšããŠãMFPã®ã¡ã¢ãªãç©æ¥µçã«æ¶è²»ããããšãªããä»»æã®æ°ã®httpèŠæ±ãé£ç¶ããŠå®è¡ã§ããŸãã æçµçµæã§ã¯ããã®ãµãŒãã¹ã«ã¯httpã€ã³ã¿ãŒã»ãã¿ãŒã®æ©èœãå«ãŸããŠããïŒãªã¯ãšã¹ãã®æçµå¿çã«å€æŽãå ããå¯èœæ§ããªããhttpãªã¹ããŒãåŒã³åºãæ¹ãæ£ç¢ºã§ãããšã©ãŒããã°ã«èšé²ããããã«äœ¿çšããŸãïŒããªã¯ãšã¹ããã¥ãŒ$ http.cancelïŒïŒããã£ã³ã»ã«ããçµæã®ãªããžã§ã¯ãã®è¿œå ã®ããããã£ãããã«ããããªã¯ãšã¹ãããŠãŒã¶ãŒã«ãã£ãŠãã£ã³ã»ã«ãããããã¿ã€ã ã¢ãŠãïŒãªã¯ãšã¹ãããšã«30ç§ïŒã§èœã¡ãããšãçè§£ã§ããŸããæ¬¡ã«äŸã瀺ããŸãã
$http.get(...).catch(function (response) { if (response.canceled) { ... } });
次ã®ã¹ãããã¯ãMFP soapãµãŒãã¹ã³ãŒã«ã察å¿ããAngularãµãŒãã¹ã§ã©ããããããšã§ãã ããã§ã®äž»ãªåé¡ã¯ãMFPããããã°ãsoap'ml xmlã®åœ¢åŒã§åçãååŸããæ¬åœã«å¿
èŠãªããŒã¿ãæ°ãã€ãããããããªãããšã§ãã ãã®æé ãç°¡çŽ åããããã«ãå
ã®xmlïŒæååãšããŠåãåã£ãïŒãããæ£èŠè¡šçŸã䜿çšããŠãé¢å¿ã®ããã¿ã°ã®ã¿ããåé€ãããŸãã
var parser = new DOMParser(); function toXml (xml, tag) { if (tag) { var node = new RegExp('((<|<)[\\w:]*' + tag + '(>|>|\\s).*\/[\\w:]*' + tag + '(>|>))', 'g').exec(xml); return node && node.length ? parse(node[1]) : null; } else { return parse(xml); } } function parse(xml) { return parser.parseFromString(xml .replace(/amp;/g, '') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/<\w+:/g, '<') .replace(/<\/\w+:/g, '<\/'), 'text/xml').documentElement; }
ãã®çµæãDOMããªãŒãååŸãããããããããŒã¿ãååŸããããšã¯é£ãããããŸããã ããã«ãDOMããªãŒã§ã¯ãquerySelectorã®æ©èœã䜿çšããŠãèå³ã®ããã¿ã°ãæ€çŽ¢ã§ããŸãã æåãXerox SDKã®ã³ãŒãã¯åžžã«xmlå¿çãå
šäœãšããŠè§£æããDOMããªãŒå
ã®æ€çŽ¢ã¯ãç®çã®èŠçŽ ãèŠã€ãããŸã§ïŒJSã®èµ°ãæžãXPathã®ãããªãã®ïŒããªãŒã®ã«ã¹ã¿ã ãã©ããŒãµã«ã«ãã£ãŠå®è¡ãããŸããã ã©ã¡ãã®ã¢ãããŒããã¡ã¢ãªãšã·ã¹ãã ãªãœãŒã¹ãããè¯ãããããŠããå°ãªãæ¶è²»ããããçããã®ã¯æ¬åœã«é£ããã§ãããäœããã®çç±ã§ãç§ãã¡ã¯å人çãªãã€ãã£ããã©ãŠã¶æ©èœDomParser.parseFromStringãquerySelectorïŒquerySelectorAllïŒãæåã§ãã©ããŒã¹ãããããDOMããªãŒãæäœããããã«å人çã«ä¿¡é ŒããŠããŸãã
åèšïŒhttp-requestsãšåçŽãªxmlã®æ§æè§£æãå®è¡ããããã®ç¬èªã®æ©èœãéçºãã2.3kbãå ããçž®å°åœ¢åŒã§äœæããŸããã äŸåããXerox SDKã³ãŒãã¯ãã¹ãŠã¢ããªã±ãŒã·ã§ã³ããåé€ãããçž®å°ããã圢åŒã§17 kbãå æããŸããã
ãµãŒãã¹$ httpããã³$ httpBackendã¯ãAngularJSããåé€ãããŸããã
ã«ãŒãã£ã³ã°
åœåããããžã§ã¯ãã§ã¯ããç¥ããã
ui-routerããŒãžã§ã³0.2.13ã䜿çšããŸããã ããã¯æ¬åœã«çŽ æŽããããå€ç®çã§ãAngularJSã«ãšã£ãŠé¡ã®ãªããœãªã¥ãŒã·ã§ã³ã®1ã€ã§ãã ããã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®éåžžã«éåžžã®ã«ãŒãã£ã³ã°ãäœæããŸãããã¢ãŒãã«ãŠã£ã³ããŠã§ã¯ããã¹ããããç¶æ
ã䜿çšãããŸããã
ãã¡ãããAngularJSéçºè
èªèº«ããçŽæ¥
æäŸããããæ©èœçã§è»œéãª
ãœãªã¥ãŒã·ã§ã³ã¯ãããŸãããåœåã¯çŽç²ãªåœ¢åŒã«ã¯é©åãããã¢ãŒãã«ãŠã£ã³ããŠã®æ¹åãå¿
èŠã§ããã ããããç¬èªã®ãœãªã¥ãŒã·ã§ã³ã®éçºã«ç©æ¥µçã«äœ¿çšãããã®ã¯ããã®ã¢ãžã¥ãŒã«ã®ãœãŒã¹ã³ãŒãã§ããã ã¢ããªã±ãŒã·ã§ã³ãæé©åããéçšã§ãUIã«ãŒã¿ãŒã¢ãžã¥ãŒã«ã®ãã¹ãŠã®æ©èœãå¿
èŠã§ã¯ãªãããšãããããŸãããã€ãŸããURLã«ãŒãã£ã³ã°ïŒMFPäžã®ã¢ããªã±ãŒã·ã§ã³ã¯å
šç»é¢ã§éããã¢ãã¬ã¹ããŒãžã®ã¢ã¯ã»ã¹ã¯ãããŸããïŒããã¹ãç¶æ
ãã«ãŒãã£ã³ã°ãªã©ããå¿
èŠãªã®ã¯æ¬¡ã®ãšããã§ãã
1.ã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ïŒç»é¢ãšã¢ãŒãã«ãŠã£ã³ããŠïŒãç°¡åã«æ§æããæ©èœã
2.ç»é¢ãšïŒãŸãã¯ïŒã¢ãŒãã«ãŠã£ã³ããŠéã®ãã£ãã·ã³ã°ãšããã²ãŒã·ã§ã³ã®ããã®é¢é£ãããã£ã¬ã¯ãã£ããšãµãŒãã¹ã
3. DOMããªãŒããã®èšªåæžã¿ç»é¢ã®htmlãã³ãã¬ãŒãã®æ£ãã眮æãšåé€ãããã³å
ã®ç»é¢ïŒui-routerã®ãã¹ãç¶æ
ã®é¡äŒŒç©ããã ãããã¹ãã¬ãã«ã¯1ã€ã ãå¿
èŠã§ãïŒã®äžã®ã¢ãŒãã«ãŠã£ã³ããŠã®è¡šç€ºã
æåã®æ®µèœã¯éåžžã«ç°¡åã«å®è£
ã§ããŸãã
xerox.provider("$route", function () { ... var base = "/"; var routes = {}; var start; var self = this;
æ§ææ®µéïŒ
xerox.config(["$routeProvider", function ($routeProvider) { $routeProvider
2çªç®ã®é
ç®ã¯ããµãŒãã¹ãéããŠå®è£
ãããŸãã
$ãã¥ãŒ
xerox.factory("$view", ["$http", "$locale", "$q", function ($http, $locale, $q) { var views = {}; return {
ããã³$ã«ãŒã
return {
ãŸããxrx-backãã£ã¬ã¯ãã£ãïŒ
xerox.directive("xrxBack", ["$route", function ($route) { return { restrict: "A", link: function (scope, element) { element.on(xrxClick, $route.back); } }; }]);
xrx-srefïŒ
xerox.directive("xrxSref", ["$route", function ($route) { return { restrict: "A", link: function (scope, element, attr) { element.on(xrxClick, function () { $route.go(attr.xrxSref); }); } } }]);
ããã³scriptDirectiveïŒããã¹ãã®ãã£ãã·ã¥/ ng-templateïŒïŒ
xerox.directive("script", ["$view", function ($view) { return { restrict: "E", terminal: true, compile: function(element, attr) { if (attr.type == "text/ng-template") { $view.put(attr.id, element[0].text); } } }; }]);
$ã«ãŒããµãŒãã¹ã§ã¯ãã¢ãŒãã«ãŠã£ã³ããŠã®è¿œå ã®ããžãã¯ãæŽçããŸããã€ãŸãã1ïŒããããç¶æ
å±¥æŽã«å
¥ããã2ïŒã¢ãŒãã«ãŠã£ã³ããŠãéããŠãããšãã«$ route.backãåŒã³åºãããšãããšãã¢ãŒãã«ãŠã£ã³ããŠãéããå¿
èŠãããã€ãã³ããããªã¬ãŒããŸãã ã€ãã³ãã¯ãxrx-viewãã£ã¬ã¯ãã£ãã«ãã£ãŠçœ²åãããŸããããã¯ã段èœ3ãå®è£
ããŸãã
xerox.directive("xrxView", ["$compile", "$controller", "$route", function ($compile, $controller, $route) { return { restrict: "A", link: function (scope, element) { var stateScope; var modalScope; var modalElement; var targetElement;
ããã ãã§ã ã«ãŒãã£ã³ã°ã¯å¯èœãªéã軜éã§ãå®éã®htmlãã³ãã¬ãŒããš<script type = text / ng-template> ... </ script>ã®é¡äŒŒç©ã®äž¡æ¹ããµããŒãããå¿
èŠãªã¢ãŒãã«ãŠã£ã³ããŠã®ããžãã¯ãå®è£
ããŸãã ããã«ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãæäœããã³æ§æããããã®UIã«ãŒã¿ãŒã«äŒŒãæ§æããããŸãã
åèšïŒ28kbã®ui-routerã¯ã¢ããªã±ãŒã·ã§ã³ããé€å€ãããç¬èªã®æ©èœã¯1.8kbããå æããªãæå°éã®åœ¢åŒã§éçºãããŸããã
以äžã®ãµãŒãã¹ãšãã£ã¬ã¯ãã£ãã¯ãAngularJSããåé€ãããŸããã
- ng-controller
- ng-include
- scriptDirectiveïŒtext / ng-templateã¿ã€ãã®ã¹ã¯ãªããã$ templateCacheã«é
眮ïŒ
- $ anchorScroll
- $å Žæ
- $ cacheFactory
- $ templateCache
ã¢ããªã±ãŒã·ã§ã³ã®ããŒã«ã©ã€ãº
æ¬æ Œçãªã¢ããªã±ãŒã·ã§ã³ã®æé©åã宿œãå§ããé ã«ã¯ãè±èªããã€ãèªããã©ã³ã¹èªãã€ã¿ãªã¢èªãã¹ãã€ã³èªããã«ãã¬ã«èªã®6ã€ã®èšèªã§ã»ãŒå®å
šã«ããŒã«ã©ã€ãºãããã¢ããªã±ãŒã·ã§ã³ãæ¢ã«ãããŸããã èšèªããã¹ãã¯JSONã®ããŒãšå€ã®ã¿ã€ãããšã«ä¿åãããäžæ¹åãã€ã³ãã£ã³ã°{{:: locale.HELLO_HABR}}ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã§çœ®æãããŸããã JSONããããŒã«ã©ã€ãºãããŒãããå Žåããã¹ãŠãéåžžã«åçŽã§ãããæé©åãããã®ã¯ãã以äžãããŸããã
angular.element(document).ready(function () { window.$locale(function () { angular.bootstrap(document.body, ["xerox"]); }); });
$ãã±ãŒã«é¢æ°å
ã§ãã€ã³ã¿ãŒãã§ãŒã¹èšèªãå®çŸ©ãããJSONããæãé©åãªèšèªãã°ããŒãã«xhrã䜿çšããŠããŒããããŸãã
ãã ããããã§ã¯ã¢ããªã±ãŒã·ã§ã³ã®ãªã¢ã«ã¿ã€ã ããŒã«ãªãŒãŒã·ã§ã³ã®æ®µéãæé©åã§ããŸãããã ããäžæ¹åã®ãã€ã³ãã£ã³ã°ã䜿çšããŸãããããã¯ããŒãžã«å
¥ããã³ã«ãã€ãžã§ã¹ããµã€ã¯ã«å
ã®è¿œå äœæ¥ã§ãã ããã«ãããŒã«ã©ã€ãºã«ã¯ãng-bind-htmlã®äœ¿çšãå¿
èŠãšããã¬ã€ã¢ãŠãã®ããã¹ãããããŸããããã¯ã$ sanitizeãµãŒãã¹ã«ãã远å ã®ãã§ãã¯ã䌎ããŸãã ãœãªã¥ãŒã·ã§ã³ã¯æåãšã¯ã»ã©é ãã§ãããå®éã«ã¯ãã«ãŒãã£ã³ã°ãéçºãããç¬éãŸã§ããã以äžäŸ¿å©ãªããšã¯ã§ããŸããã§ããã $ view htmlãã³ãã¬ãŒããããŒãããã³ãã£ãã·ã¥ããããã®ç¬èªã®ãµãŒãã¹ã®åºçŸã«ãããã¢ããªã±ãŒã·ã§ã³ãããŒã«ã©ã€ãºããããã«ããã䜿çšãããšããèãã¯ééããããŸããã
ããã®ããã«äœãããªããã°ãªããŸããã§ãããïŒ ååãšããŠãããªãïŒ
1.ãã¹ãŠã®htmlãã³ãã¬ãŒãã§ãããŒã«ã©ã€ãºãå¿
èŠãªå Žæã¯äºéè§æ¬åŒ§ã§å²ãŸããŠããå¿
èŠããããŸãã{{:: locale.HELLO_HABR}}ããããããã¯[[HELLO_HABR]]ã«ãªããŸããã
2.ãã®è§æ¬åŒ§ã®çµã¿åããã¯ã¢ããªã±ãŒã·ã§ã³å
ã§äžæã§ãããããæ£èŠè¡šçŸã䜿çšããŠéåžžã®çœ®æãè¡ãã宿ããDOMã®æ®µéãšãã€ãžã§ã¹ããµã€ã¯ã«å
šäœããã€ãã¹ããããããæ£ç¢ºã«ã¯ããã³ãã¬ãŒããã³ã³ãã€ã«ããŠæ¿å
¥ããåã«ããŒã«ã©ã€ãºã§ããŸãDOMïŒ
2. xerox.factory("$view", ["$http", "$locale", "$q", function ($http, $locale, $q) { var views = {};
ãããã£ãŠãããŒã«ã©ã€ãºã¯Angularã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«äžåºŠããªã¬ãŒãããã¡ã¢ãªã«ã¯ããŒã«ã©ã€ãºãããhtmlãã³ãã¬ãŒãããã§ã«ä¿åãããŠããŸãã
åèšïŒã¢ããªã±ãŒã·ã§ã³ã®ããŒã«ã©ã€ãºã¯ããã€ãžã§ã¹ããµã€ã¯ã«ããã¢ããªã±ãŒã·ã§ã³ããŒãã®æ®µéãŸã§åé€ãããŸãã
以äžã®ãµãŒãã¹ãšãã£ã¬ã¯ãã£ãã¯ãAngularJSããåé€ãããŸããã
- ng-bind
- ng-bind-html
- ng-bind-template
- ng-pluralize
- $$ sanitizeUri
- $ sce
- $ sceDelegate
ng-model
ng-modelãã£ã¬ã¯ãã£ãïŒããã³ããã«é¢é£ä»ããããHTMLãã©ãŒã ãæäœããããã®ãã®ä»ã®ãã£ã¬ã¯ãã£ãïŒã¯ãAngularJSã®çç ã®1ã€ã§ãããæåã®ç¥ãåãããæã«èœã¡ãä¿¡ããããªãã»ã©ã®ããŒã«ã§ãã ããããng-modelã®è£ã«é ããŠãããã®ãç¥ã£ãŠãã人ã¯ã»ãšãã©ããŸããã ããã¯å®éã«ã¯éåžžã«éãã³ãŒãã§ãèŠçŽ ã®ã€ãã³ãïŒã«ããã貌ãä»ãã倿ŽãããŒããŠã³ïŒãç£èŠããã¢ãã«ã®å®éã®å€ãç»é¢ã«è¡šç€ºãããå€ãšåæããã¢ãã«ã倿Žããšã«ãã§ãã¯ãããã£ã¬ã¯ãã£ãã§ã¢ãã«ãæäœããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ãããŒã©ãŒãæäŸããŸãã
å®éãããããã¹ãŠã®æ©äŒãå¿
èŠãªããã§ã¯ãªãããšãããããŸããã ããšãã°ããã¹ãŠã®ã¬ã€ãã©ã€ã³ã«ãããšãæ¿èªãã©ãŒã ã§ãããµãŒããŒèŠæ±ã倱æããåŸã«ã®ã¿ã¢ãŒãã«ãŠã£ã³ããŠã«ãšã©ãŒã衚瀺ããããããæ€èšŒã¯å¿
èŠãããŸããã ã«ã¹ã¿ã ãã§ãã¯ããã¯ã¹ãéžæããã¯ã¹ãããã³ãªã¹ããæ€èšŒãå¿
èŠãšãããããããå®è£
ãããã£ã¬ã¯ãã£ãã¯èªã¿åã/æžã蟌ã¿-ãŠã©ããã¢ãŒãã®ã¢ãã«ã§åäœããŸãã ã€ãŸããcheckboxãã£ã¬ã¯ãã£ãã¯æ¬¡ã®ããã«ãªããŸãã
xerox.directive("checkbox", function () { return { restrict: "E", scope: { xrxModel: "=" }, link: function (scope, element) { var icon = xrxElement("<div class=checkbox-icon>"); element.prepend(icon); icon.on(xrxClick, function () { if (!element.attr(xrxDisabled)) { scope.$apply(function () { scope.xrxModel = !scope.xrxModel; }); } }); scope.$watch("xrxModel", function (value) { element[value ? "addClass" : "removeClass"]("checked"); }); } }; });
å¯äžã®ããšã¯ãããã¹ãå
¥åã䜿çšããèªèšŒãã©ãŒã ãããããšã§ãã ãã®ãããng-modelãªã©ã®ããŒããŒããã£ã¬ã¯ãã£ãã¯ãã¢ãã«ãæäœãããšãã«æ€èšŒãã©ã€ãã€ãŒã«ããã®ä»ã®AngularJSã®æ©èœãéå§ããããšãªããã«ããã倿Žã貌ãä»ãã€ãã³ãã远跡ããŸããããã軜éãªåœ¢åŒã§ãã
ããŒããŒãã«ã€ããŠè§Šããã®ã§ãå®éã®å€èŠ³ãæ¬¡ã«ç€ºããŸãã

ã¬ã€ã¢ãŠãå
šäœã¯ãè峿·±ãæé©åã«ãããJSåŽã§æ§ç¯ãããŸãïŒãã£ã¬ã¯ãã£ãã«htmlãã³ãã¬ãŒãã¯ãããŸããïŒ-ã¯ãªãã¯ã€ãã³ãã¯ããã¹ãŠã®ãã¿ã³ã§ã¯ãªããå
±éã®ã³ã³ãããŒã§ãã³ã°ããŸãã ããã«ãããã€ãã³ããã³ãã©ãŒã®ç¯çŽã¯å°ãããªããŸãããããã§ãã¢ããªã±ãŒã·ã§ã³ãå æããã¡ã¢ãªãç¯çŽãããŸãã
åèšïŒä»¥äžã®ãã£ã¬ã¯ãã£ãã¯ãAngularJSããåé€ãããŸããã
ng-model
ng-list
ng-change
æš¡æ§
å¿
èŠãª
æå°é·
æå€§é·
ng-value
ng-model-options
ng-options
ng-init
ng-form
å
¥å
圢
éžæãã
ã¹ã¯ããŒã«
ç«ãšã¹ã¯ããŒã«å¯èœãªãªã¹ãã«å€ãã®ãªã€ã«ã远å ãããŸããïŒ

ã¡ã¢ãªæ¶è²»ãæé©åããããã«ãng-repeatïŒåèŠçŽ ã«ç¬èªã®ã¹ã³ãŒããäœæããïŒãæŸæ£ãã軜éãœãªã¥ãŒã·ã§ã³ãäœæããŠããã ãã§ãããšèããŸãããã38èšèªã®ãªã¹ãã®ã¬ã³ããªã³ã°ã¯MFPã§ããªãé
ããªããŸããã ããã«ããã®åé¡ã¯ãMFPããã©ãŠã¶ãŒã«ã·ã¹ãã ã¹ã¯ããŒã«ãæç»ãããç¬èªã®ææ®µã䜿çšããŠæç»ããå¿
èŠããããšããäºå®ã«ãã£ãŠæªåããŸããã -webkit-scrollbarã®äœ¿çšãããelement.scrollTopãŸãã¯-webkit-transformïŒtranslateïŒxãyïŒthrough overflowïŒhiddenã®ã«ã¹ã¿ã ã¹ã¯ããŒã«ãŸã§ãå€ãã®ããªãã¯ã詊ããŸããã ãã©ãŠã¶ãã¬ã³ããªã³ã°ããåçãçè§£ãã詊ã¿ã倱æããŸããã ã¹ã¯ããŒã«èªäœãé
ããªããããªã¹ããåæ§ç¯ãããŸããïŒãŠãŒã¶ãŒãå¥ã®ãœãŒã¹èšèªãéžæããéžæãããœãŒã¹èšèªãå«ãŸãªãèšèªã®ã¿ãŒã²ãããªã¹ããåæ§ç¯ããå¿
èŠããããŸãïŒã
ãã§ã«ã»ãšãã©åžæã倱ããæ¬¡ã®å®éšã®1ã€ã§ããªã¹ãã«è€æ°ã®èŠçŽ ãæ¿å
¥ããŠinnerHTMLã®ã¿ã倿Žãããšãã¬ã³ããªã³ã°ãé
ããªãããã¹ã¯ããŒã«ãã¹ã ãŒãºã«é
å»¶ãªãå®è¡ãããããšã«æ°ä»ããŸããã ãã®å°é£ãªæ¹æ³ã§ãã¹ã¯ããŒã«ã®ãã£ã¬ã¯ãã£ããã¢ããªã±ãŒã·ã§ã³ã«çŸããŸããããã®æäœã®åçã¯ã·ã³ãã«ã§ãããªããunningã§ãïŒ
1.å¿
èŠãªæ°ã®èŠçŽ ãã³ã³ããã«æ¿å
¥ãããŠããªã¹ãã®7ã€ã®èŠçŽ ãªã©ãã³ã³ããã®é«ãå
šäœãåããããŸãã
2.ãªãã»ããå€ïŒããŒã¿é
åã®å
é ããã®ã€ã³ãã³ãïŒãšhtmlãã³ãã¬ãŒãã«åºã¥ããŠãèŠçŽ ã®innerHTMLã倿ŽãããŸãã
3.ã¹ã¯ããŒã«ç¢å°ãã¯ãªãã¯ããããã¹ã©ã€ããŒã®ããã©ãã°ãïŒmouseDown-mouseMove-mouseUpïŒã€ãã³ãããã£ãããããªãã»ãããèšç®ããã¹ã©ã€ããŒã®äœçœ®ã倿ŽããŠãæé 2ã«æ»ããŸãã
ãããã£ãŠãå®éã«ã¯ãã¹ãŠã®åã7ã€ã®ãªã¹ãã¢ã€ãã ã®å
éšã³ã³ãã³ãã®ã¿ã倿ŽãããŸãããããŒã¿ã¹ã¯ããŒã«ã®æèŠãçãŸããŸãã
åèšïŒng-repeatãã£ã¬ã¯ãã£ãã¯ãã¯ãæå³ããªããªããããAngularJSããåé€ãããæ°ããscrollãã£ã¬ã¯ãã£ãã¯å¿
èŠãªãã¹ãŠã®äœæ¥ãå®è¡ããŸããã
ãªãã·ã§ãã«
ããã«ãAngularJSã§ä»ã®å€ãã®ã·ã£ãŒãããºã ãå®è¡ãããŸããã
- ã¢ãã¡ãŒã·ã§ã³æ©èœãå®å
šã«åé€ïŒ$ã¢ãã¡ãŒã·ã§ã³ã$$ rAFïŒã
- ã¯ã©ã¹ããã³å±æ§ïŒng-classãng-class-evenãªã©ïŒãæäœããããã®ãã£ã¬ã¯ãã£ããåé€ãããŸããã
- ng-ifãšng-switchã¯æé©åããã察å¿ãããã®ã«çœ®ãæããããŸã-è¡šç€ºïŒæ¡ä»¶ãæºãããªãhtmlèŠçŽ ã«ã¯noneãèšå®ãããå
ã®ãã£ã¬ã¯ãã£ãã®ããã«ã¹ã³ãŒãã®äœæããã€ãã¹ããng-showãšng-hideã¯å®å
šã«åé€ãããŸãã
- $ãã£ã«ã¿ãŒãš$ãã±ãŒã«ãåé€ãããå¿
èŠãªããŒã¿ã¯ãã¹ãŠãå°èŠæš¡ãªèªå·±èšè¿°ãœãªã¥ãŒã·ã§ã³ã«åºã¥ããŠãµãŒãã¹ã§çŽæ¥æºåãããŸãã
ãã®çµæãããã¯ã¹ã®ãã¹ãŠã®ãã£ã¬ã¯ãã£ããAngularJSããåé€ããããµãŒãã¹ã®ãªã¹ãã¯æ¬¡ã®åœ¢åŒãåããŸããã
- $ã³ã³ãã€ã«
- $ãã©ãŠã¶
- $ã³ã³ãããŒã©ãŒ
- $ exceptionHandler
- $è£éãã
- $ãã°
- $è§£æ
- $ rootScope
- $ q
AngularJSã®åæåãšäœæ¥ãµã€ã¯ã«ã«ã¯å¹²æžããŸããã§ããããjqLitââeããããã«å€æŽããŸããã
çµè«
Webã¢ããªã±ãŒã·ã§ã³ã®ææ°ã®éçºã§ã¯ã1ã€ã®å°ããªæ©èœãŸãã¯æ©èœã®ããã«ãããªãå€§èŠæš¡ãªãµãŒãããŒãã£ãœãªã¥ãŒã·ã§ã³ãå«ããããšã«ãããã¢ããªã±ãŒã·ã§ã³ã®å€§é£ããé£èºçã«å¢ãããŠããŸãã ããããããã®å€§é£ãã¯ãã¹ã¯ããããã©ãããããã§ã¯ããã»ã©é¡èã§ã¯ãããŸããããããŒããŠã§ã¢ã®è©°ãç©ã匱ãããã€ã¹ã¯ãã®ãããªã¢ããªã±ãŒã·ã§ã³ãæ¶åããã®ãé£ãããããã«ããªããŠã©ãŒã ã¢ããããŸãã
ç§ãã¡èªèº«ã®çµéšãããå¿
èŠãªæé©åã®æãæ¥ããšãã»ãšãã©ãã¹ãŠã®åµé çãªéçºããŒã ããããè¡ãããšãã§ããããšãããããŸããã 説æãããã¹ãŠã®æé©åã«è²»ããããæéã¯ããããžã§ã¯ãéçºæéå
šäœã®çŽ12ã15ïŒ
ã§ãããããã¯ãååãšããŠååã§ãããéæãããçµæã«éåžžã«æºè¶³ããŠããŸãã
AngularJSã¯å®éã«ã¯ã¢ãžã¥ã©ãŒãã¬ãŒã ã¯ãŒã¯ã§ãããå¿
èŠãªæ©èœã»ãããæ§æããŠããŠã³ããŒãããããšã¯ã§ããŸãããïŒããšãã°ãjQuery UIã䜿çšããŠå®è¡ã§ããŸãïŒãAngularJSããäžèŠãªãã£ã¬ã¯ãã£ããšãµãŒãã¹ãé€å€ããéã«äžå¿«æã¯ãããŸããã§ããã å€§èŠæš¡ãªæé©åãšãªãã¡ã¯ã¿ãªã³ã°ãã»ãŒç¡çã§å®è¡ã§ããããã«ããã®ã¯ãã¢ããªã±ãŒã·ã§ã³éçºã®ã¢ãžã¥ãŒã«åŒã¢ãããŒãã§ãã
ããã§ãããã®ãããªæé©åã¯ãã·ã¹ãã ã®ãšã³ããŠãŒã¶ãŒãšéçºããŒã å
šäœãæ°é£ããšããæ çµã¿ã ãã§ãªããæããç¡å¶éã®ç±æã®çµæãšããŠã匷å¶ããããšä¿¡ããããšæã£ãŠããŸãã
ãããžã§ã¯ãã«ç©æ¥µçã«åå ããŠ
ãããSimbirSoftã®å°éå®¶ã«æè¬ããŸãã