
å©äŸ¿æ§ãšã¯ãäž»ã«ãææã®ãªã¹ãã§ããŒãã«ããœãŒãããããŒãžããªããŒãããã«äœæ¥ã§ããããšãæå³ããŸãã ããŒãã«ã«å€ãã®è³æãããå ŽåãããŒãžã«åå²ããã¿ã¹ã¯ãçºçããŸãã
tablesorterPagerãåããããç¥ãããŠããjQuery tablesorterãã©ã°ã€ã³ãšãããŸãç¥ãããŠããªããããæ©èœçãªDataTablesã¯åªããŠããŸãããããã€ãã®æ¬ ç¹ããããŸãã äž»ãªãã®ã¯ãããŒãã«ã«æ°ããè¡ãåçã«è¿œå ããã®ãé£ããããšã§ãïŒããŒãã«ã«è¡ãè¿œå ããåŸãæ°ããè¡ã¯æ¬¡ã«ãœãŒããåŒã³åºããããšãã«å€±ãããŸãïŒã äžè¬çã«ãtablesorterã¯ãã£ãã·ã¥ã«è¡ãè¿œå ããæ段ãæäŸããŸãããDataTablesã¯ããŒãã«ã®å éšè¡šçŸãå¶åŸ¡ããããã®åºãæ©èœçãªAPIãæäŸããŸããããã®APIã¯ããªãåé·ã§ãããããŸãæè»æ§ããããŸããã
æ¯èŒçæ°ããAngularJS javascriptãã¬ãŒã ã¯ãŒã¯ã®ç®¡çããã«ã®å®è£ ãäžè¬ã«æäŸããããšæããŸãã 質åã®ãªã¹ããç·šéãåé¡ãããã³åçããããã®ããŒãžãäœæãããŸãã ãã®èšäºã§ã¯ä»ã®é¡äŒŒã®ãã¬ãŒã ã¯ãŒã¯ãšã®æ¯èŒã¯ãããŸããããå ¬åŒããã¥ã¡ã³ãã®åçŽãªç¹°ãè¿ãããããŸããããã¬ãŒã ã¯ãŒã¯ã®äœ¿çšçµéšãå ±æããããã䜿çšããããã®ããã€ãã®èå³æ·±ãããªãã¯ã«ã€ããŠèª¬æããŸãã
ããã«æçµçµæã衚瀺ããŸãïŒã¯ãªãã¯å¯èœïŒïŒ

ãšã³ããªãŒ
ãã¬ãŒã ã¯ãŒã¯ã«ã€ããŠå°ã説æããŸãã AngularJSã¯ãGoogleãèšç«ãããããžã§ã¯ãã§ããJavascript MVCãã¬ãŒã ã¯ãŒã¯ã§ãã ç¬èªã®é«ã¬ãã«ajaxå®è£ ããŠããããã¹ãããã³e2eãã¹ãçšã®çµã¿èŸŒã¿ããŒã«ãå«ãŸããŠããŸãïŒãŠããããã¹ãçšã®ãžã£ã¹ãã³ããšã³ãããŒãšã³ããã¹ãçšã®ç¹å¥ãªãã¹ããµãŒããŒãèµ·åãããŸãïŒã ç§ã¯ãã¹ããæ€èšããŸãããããã¯å¥ã®èšäºã®ãããã¯ã§ãã Aavã¯æè¿ã圌ã®æçš¿ã§ãã¬ãŒã ã¯ãŒã¯ã«ã€ããŠãã詳现ã«æžããŸãã ã
圌ã«æåã«äŒã£ãã®ã¯ãèšäºã AngularJSãã¯ãŒã«ãª7ã€ã®çç± ãã§ãã æ®å¿µãªããã å ¬åŒã®ããã¥ã¡ã³ã ïŒã¡ãªã¿ã«ããªãè¯ãïŒä»¥å€ã«ãAngularJSã®æäœæ¹æ³ã説æããèšäºã1ã€ããèŠã€ãããŸããã§ããïŒææ°ããŒãžã§ã³ã§ã¯ãããŸããïŒã ãŸãããã¬ãŒã ã¯ãŒã¯ã®æåã®ç¥èã«ã€ããŠã¯ã å ¬åŒãã¢ãŒãã芧ã«ãªãããšããå§ãããŸãã
AngularJSãã¬ãŒã ã¯ãŒã¯ã®åºæ¬
管çããã«ã®éçºã«ç§»ããŸãããã index.htmlã€ã³ããã¯ã¹ãã¡ã€ã«ããã©ãŠã¶ã«èªã¿èŸŒãŸããŸãããã®åŸãã©ãã«ãæ®ããããã¹ãŠã®äœæ¥ã¯åçèªã¿èŸŒã¿ã䜿çšããŠè¡ãããŸãã ãã¡ã€ã«èªäœã«ã¯ç¹å¥ãªãã®ã¯å«ãŸããŠããŸããã ãã®ç¹ã§éèŠãªã®ã¯ã<html>ã¿ã°ã®ng-app =â adminâå±æ§ãšãããŒãžãé 眮ããã<div ng-view> </ div>ã»ã¯ã·ã§ã³ã§ãã
<!doctype html> <html lang="ru" ng-app="admin"> <head> <meta charset="utf-8"> <title>Admin page - Questions</title> <link rel="stylesheet" href="css/app.css"/> <link rel="stylesheet" href="css/bootstrap.css"/> <link rel="stylesheet" href="css/bootstrap-responsive.css"/> </head> <body> <div ng-view></div> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <script>!window.jQuery && document.write(unescape('%3Cscript src="/js/jquery.js"%3E%3C/script%3E'))</script> <script src="lib/angular/angular.js"></script> <script src="lib/angular/angular-resource.js"></script> <script src="js/app.js"></script> <script src="js/services.js"></script> <script src="js/controllers.js"></script> <script src="js/directives.js"></script> </body> </html>
ã芧ã®ãšãããAngularJSã¯é«åºŠãªã¿ã°å±æ§ïŒãã£ã¬ã¯ãã£ãïŒã§åäœããŸãã ãã£ã¬ã¯ãã£ãã¯ããã€ãã®æ¹æ³ã§èšè¿°ã§ããŸãã次ã®ãšã³ããªã¯åäžã§ãïŒng-app =â adminâãdata-ng-app =â adminâãããã«ããã€ãã®ã¡ãœããããããŸãã ç¬èªã®ãã£ã¬ã¯ãã£ããéçºããããšãã§ããŸãã
AngularJSã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒããè€æ°ã®ãã¡ã€ã«ã«åå²ã§ããŸãã app.js-ã¢ããªã±ãŒã·ã§ã³ã®åæåãã«ãŒãã£ã³ã°ãservices.js-ããŸããŸãªãµãŒãã¹ã®äœæããªã¢ãŒããªãœãŒã¹ã®èª¬æïŒããšãã°ãajaxããŒã¿ã®èªã¿èŸŒã¿çšïŒãã³ã³ãããŒã©ãŒã§äœ¿çšå¯èœãcontrollers.js-ã³ã³ãããŒã©ãŒèªäœãfilters.js-ãã£ã«ã¿ãŒãããŒã¿åºåã§äœ¿çšãããdirectives.js-ç¬èªã®htmlãã£ã¬ã¯ãã£ããäœæããŸãã
App.jsãã¡ã€ã«ïŒ
'use strict'; angular.module('admin', ['admin.services','admin.filters']) .config(['$routeProvider', function($routeProvider) { $routeProvider .when('/list', {template: 'views/list.html', controller: ListCtrl}) .when('/new', {template: 'views/edit.html', controller: NewCtrl}) .when('/edit/:id', {template: 'views/edit.html', controller: EditCtrl}) .otherwise({redirectTo: '/list'}); }, ]);
ããã§ããã¥ãŒã«ã«ãŒããå²ãåœãŠãŸãã ã¡ãªã¿ã«ãmyadmin.com /ïŒ/ listã®ããã«ãªããŸãïŒïŒïŒãå®è¡ããããšãã§ããŸã ããã㯠ãã€ã³ããã¯ã¹äœæã®æšæºãšã㊠Google ãæ¡çšãããã®ã§ãã ãã¥ãŒã/ views /ãã©ã«ãã«é 眮ããŸããïŒäœæè / partials /ãææ¡ãããã¥ãŒãšã¯ç°ãªããŸãïŒã èå³æ·±ãããšã«ãAngularJSã¯ããããå Žæã§ããuse strictããšããå³å¯ã¢ãŒãã䜿çšããããšãæäŸããŠããŸãïŒ ãã®èšäºã§ã¯use strictã«ã€ããŠè©³ãã説æããŠããŸãïŒã
ããã«ãè³æã®ãªã¹ãã®ç°¡ç¥çãæäŸããŸããããã¯ãèšäºã®éçšã§è£è¶³ãããŸãã 段éçãªéçºã¯ãèªè ã«ãšã£ãŠããæçšã§ç解ãããããã®ã«ãªããšæããŸãã
/views/list.htmlãã¡ã€ã«ïŒ
<div id="table-wrapper"> <div class="filter tools pull-right"> <input ng-model="filterStr" class="search-query"> </div> <div class="tools pull-left"> <a href="#/new" class="btn btn-success"> </a> </div> <table class="table table-striped"> <thead> <tr> <th ng-repeat="head in tablehead" >{{head.title}}</th> </tr> </thead> <tbody> <tr ng-repeat="item in items | filter:filterStr"> <td><a href="#/edit/{{item.id}}">{{item.title}}</a></td> <td>{{item.category}}</td> <td>{{item.answerer}}</td> <td>{{item.author}}</td> <td>{{item.created}}</td> <td>{{item.answered}}</td> <td><span class="disable-item" style="color:{{['red','green'][+item.shown]}};" ng-click="disableItem()">{{['',''][+item.shown]}}</span></td> </tr> </tbody> </table> </div>
ããã§ã¯ãæ§é ['off'ã 'on'] [+ item.shown]ã«æ³šæããå¿ èŠããããŸã-item.shownïŒ0ãŸãã¯1ïŒã®å€ã«å¿ããŠãé å['off'ã 'on']ã®æååã眮æããŸããåé æŒç®ã+ãã¯ãæ°å€-é åã®ã€ã³ããã¯ã¹ãè¿ããŸãã AngularJSã§ã¯äžæ¬åŒ§å ã®ãã¬ããŒæ¡ä»¶æŒç®åïŒitem.shown> 0ïŒ 'On'ïŒ 'off'ïŒã®äœ¿çšãèš±å¯ãããŠããªããããç®çã®è¡ã®éžæããã®æ¹æ³ã§æžãçããå¿ èŠããããŸããã é åãæã€åŒã®ä»£ããã«ãåŒitem.shown> 0 && 'on' || 'off'ã䜿çšã§ããŸãã å°æ¥ã®ããŒãžã§ã³ã§ã¯ãäœæè ãã³ãŒãã³ã°ãªãã¬ãŒã¿ãŒã®ãµããŒããè¿œå ããããšãé¡ã£ãŠããŸãã ã¢ã€ãã å ã®ã¢ã€ãã ãäœæ| filterïŒfilterStrã¯itemsé åãçµã¿èŸŒã¿ã®filteré¢æ°ã«æž¡ãã転éãããããŒã¿ããã£ã«ã¿ãªã³ã°ããfilterStrå€æ°ïŒng-model = "filterStr"å±æ§ãæã€èŠçŽ ã§å®çŸ©ãããïŒãããµãã¹ããªã³ã°ãå«ãèŠçŽ ã®ã¿ãè¿ããŸãã
ã³ã³ãããŒã©ãŒcontrollers.jsã«ç§»ããŸãããïŒ
'use strict'; function ListCtrl($scope, Items, Data) { $scope.items = Items.query(function(data){ var i = 0; angular.forEach(data, function(v,k) { data[k]._id = i++; }); }); $scope.categories = Data('categories'); $scope.answerers = Data('answerers'); $scope.tablehead = [ {name:'title', title:""}, {name:'category', title:""}, {name:'answerer', title:" "}, {name:'author', title:""}, {name:'created', title:""}, {name:'answered', title:""}, {name:'shown', title:""} ]; $scope.disableItem = function() { var item = this.item; Items.toggle({id:item.id}, function() { if (data.ok) item.shown = item.shown>0?0:1; }); }; }
ãã®é¢æ°ã®ãã©ã¡ãŒã¿ãŒã¯æ¬¡ã®ãšããã§ãã$ scope-æ¬åŒ§{{}}ããã³ng-modelãã£ã¬ã¯ãã£ãã§äœ¿çšããããã³ãã¬ãŒãå ã®å€æ°ã®ã¹ã³ãŒããItemsããã³Dataã¯services.jsãã¡ã€ã«ã§å®çŸ©ããããµãŒãã¹ã§ãã ãããã£ãŠãã¢ã€ãã ã¯è³ªåã¢ãã«ã§ãããããŒã¿ã¯ãµãŒãã¹ãªã¹ãïŒè³ªåã®ã«ããŽãªãšåçïŒãååŸããããã®ããŒã«ã§ãã $ã¹ã³ãŒãã¯ãã³ã³ãããŒã©ãŒãšãã¥ãŒãçµã³ä»ããå€æ°ã§ãã ãã®å€æ°ãä»ããªãéããã³ã³ãããŒã©ãŒãããã¥ãŒã«ããŒã¿ã転éããããšã¯ã§ããŸããïŒé¢åãªå ŽåããããŸãïŒã ããŒãã«ãããé åã«ã¯ãããŒãã«ããããŒãèšè¿°ãããªããžã§ã¯ããå«ãŸããŸãã åŸã§æ¡åŒµããŸãã
ããã§ãservices.jsãã¡ã€ã«ãæ€èšããŸãã
'use strict'; angular.module('admin.services', ['ngResource']) .factory('Items', function($resource){ return $resource('back/questions/:id/:action', {}, { create: {method:'PUT'}, saveData: {method:'POST'}, toggle: {method:'GET', params:{action:'toggle'}} }); }) .factory('Data', function($resource){ var load = $resource('back/list/:name', {}); var loadList = ['answerers','categories']; var data = {}; for (var i=0; i<loadList.length; i++) data[loadList[i]] = load.get({name:loadList[i]}); return function(key){ return data[key]; }; });
ãã®ãã¡ã€ã«ã¯factoryïŒïŒé¢æ°ã䜿çšããŸãããã®å Žåããã®é¢æ°ã¯ãªãœãŒã¹ãžã§ãã¬ãŒã¿ãŒã§ãã Resource $ resourceã¯ãXMLHttpRequestã§ã®äœæ¥ãã«ãã»ã«åããçµã¿èŸŒã¿ãªããžã§ã¯ãã§ãã ããã©ã«ãã®ã¡ãœããgetïŒïŒãsaveïŒïŒãdeleteïŒïŒãå«ãŸããŠãããã¡ãœãããå®çŸ©ã§ããŸãã å®éãå·¥å Žããè¿ããããªããžã§ã¯ãã¯ããŒã¿ã¢ãã«ã§ãã ItemsãµãŒãã¹ã¯ãã¢ã¯ã»ã¹ããããã³ã«ãµãŒããŒããããŒã¿ãããŒãããŸãã ããŒãžãããŒãããããšãDataãµãŒãã¹ã¯ããŒãããããªã¹ãããã£ãã·ã¥ããèŠæ±ã«å¿ããŠãã£ãã·ã¥ããçºè¡ããŸãã
ååãšããŠããã§ã«ååšãããã®ããªã¹ãã®åäœãä¿èšŒããŸãããåŸã§é€å»ããéèŠãªæ¬ ç¹ããããŸãã ããã§ã¯ã質åãäœæããã³ç·šéããããã®ããŒãžã«ç§»ããŸãããã
ãšã³ããªã®è¿œå ãšç·šé
/views/edit.htmlãã³ãã¬ãŒãã¯éåžžã«ç°¡åã§ãïŒå°ãªããšãBootstrap cssãã¬ãŒã ã¯ãŒã¯ã«æ £ããŠãã人ã«ãšã£ãŠã¯ïŒïŒ
<form name="saveForm" class="form-horizontal"> <fieldset> <div class="control-group"> <div class="controls"> <h3>{{["",""][(item.id>0)+0]}} </h3> </div> </div> <div class="control-group" ng-class="{error: saveForm.category.$invalid}"> <label class="control-label" for="category"></label> <div class="controls"> <select name="category" ng-model="item.category" required ng-options="key as value for (key, value) in categories"></select> </div> </div> <div class="control-group" ng-class="{error: saveForm.title.$invalid}"> <label class="control-label" for="title"></label> <div class="controls"> <input name="title" ng-model="item.title" required> </div> </div> <div class="control-group" ng-class="{error: saveForm.author.$invalid}"> <label class="control-label" for="author"></label> <div class="controls"> <input name="author" ng-model="item.author" required> </div> </div> <div class="control-group" ng-class="{error: saveForm.answerer.$invalid}"> <label class="control-label" for="answerer"> </label> <div class="controls"> <select name="answerer" ng-model="item.answerer" required ng-options="key as value for (key, value) in answerers"></select> </div> </div> <div class="control-group" ng-class="{error: saveForm.answerer.$invalid}"> <label class="control-label" for="text"></label> <div class="controls"> <textarea id="text" ng-model="item.text" required></textarea> </div> </div> <div class="control-group"> <label class="control-label" for="answer"></label> <div class="controls"> <textarea id="answer" ng-model="item.answer"></textarea> </div> </div> <div class="form-actions"> <input type="button" ng-disabled="saveForm.$invalid||saveForm.$pristine" href="#/list" ng-click="save()" class="btn btn-success" value=""> <a href="#/list" class="btn"></a> </div> </fieldset> </form>
ãã®ãã³ãã¬ãŒãã«ã¯ããã€ãèå³æ·±ãç¹ããããŸãã ãªããžã§ã¯ããããªã¹ããªãã·ã§ã³<select>ãäœæãããã£ã¬ã¯ãã£ãã¯ãng-options = "key in value forïŒkeyãvalueïŒin category"ã®ããã«èšè¿°ãããŸãã forã®åŸã®ââéšåã¯ãœãŒã¹ãåç §ããforã®åã®åŒã¯ããªãã·ã§ã³ã®å€å±æ§ãšããŠäœ¿çšããå€ãšãªãã·ã§ã³ããã¹ããšããŠäœ¿çšããå€ã決å®ããŸãã
ng-class = "{errorïŒsaveForm.titleã$ Invalid}"ãã£ã¬ã¯ãã£ãã¯ãsaveForm.titleã$ Invalid == trueã®ãšãã«ã¿ã°ããšã©ãŒã¯ã©ã¹ã«èšå®ããŸãã äžè¬ã«ãããã§ã¯ãªããžã§ã¯ãã䜿çšããããã®ããŒã¯ãå€ãtrueã®å Žåã«èšå®ãããã¯ã©ã¹ã®ååã§ãã ãä¿åããã¿ã³ã¯ãåæ§ã®ãã£ã¬ã¯ãã£ãng-disabled = "saveFormã$ Invalid || saveFormã$ Pristine"ã䜿çšããŸããããã¯ãæ¡ä»¶ãæºããããå Žåããã®å Žåããã©ãŒã ã«ç¡å¹ãªå±æ§ïŒsaveFormã$ Invalid ïŒãŸãã¯ãã©ãŒã ããŸã å€æŽãããŠããŸããïŒsaveFormã$ pristineïŒã 泚ææ·±ãèªè ãåŒ<h3> {{["Addition"ã "Change"] [ïŒitem.id> 0ïŒ+0]}}ãšã³ããª</ h3>ã®ç®çãæšæž¬ããããšãé¡ã£ãŠããŸã...
app.jsãã¡ã€ã«ãããããããã«ã2ã€ã®ã³ã³ãããŒã©ãŒããã®1ã€ã®ãã³ãã¬ãŒãã«æ¥ç¶ãããŠããŸãããã®ãã³ãã¬ãŒãã¯ãcontrollers.jsãã¡ã€ã«ã«é 眮ããå¿ èŠããããŸãïŒæãéèŠãªããšãšããŠãããŒãžã«æ¥ç¶ããããšãã§ããŸãïŒã ã³ã³ãããŒã©ãŒã®ã³ãŒãïŒcontrollers.jsãã¡ã€ã«ïŒã¯æ¬¡ã®ãšããã§ãã
... function EditCtrl($scope, $routeParams, $location, Items, Data) { $scope.item = Items.get({id:$routeParams.id}); $scope.categories = Data('categories'); $scope.answerers = Data('answerers'); $scope.save = function() { $scope.item.$save({id:$scope.item.id}, function(){ $location.path('/list'); }); }; } function NewCtrl($scope, $location, Items, Data) { $scope.item = {id:0,category:'',answerer:'',title:'',text:'',answer:'',author:''}; $scope.categories = Data('categories'); $scope.answerers = Data('answerers'); $scope.save = function() { Items.create($scope.item, function(){ $location.path('/list'); }); }; }
äž¡æ¹ã®ã³ã³ãããŒã©ãŒã¯éåžžã«äŒŒãŠãããçµã¿èŸŒã¿ãããã€ããŒ$ routeParamsã䜿çšããŠããŒãžã¢ãã¬ã¹ïŒapp.jsã®ã«ãŒãã«ååã瀺ãããŠããŸãïŒããããŒã¿ãååŸããé¢æ°$ location.pathïŒ '/ list'ïŒã䜿çšããŠå¥ã®ããŒãžã«ç§»åããŸãã 泚æããŠãã ããïŒ ãã®é¢æ°ã§ïŒèšå·ã䜿çšããå¿ èŠã¯ãããŸããããhrefå±æ§ã®ãªã³ã¯ã§èšå®ããå¿ èŠããããŸãã
ãã§ã«è¡ã£ãããšã¯ã ãã®ããŒãžã§ç¢ºèªã§ããŸã ã ãã ããçŸåšã®å®è£ ã§ã¯ãã«ããŽãªã®ååã®ä»£ããã«ããã®çªå·ã衚瀺ãããŸãã ãã®æ¬ ç¹ãåãé€ããŸãã
ãªã¹ãããŒã¿ã®çœ®æ
ãŸãããµãŒããŒããåä¿¡ãããªã¹ãã®ããŒã¿ã[ã«ããŽãª]åãš[å®å ]åã«èšå®ããŸãã ãããè¡ãã«ã¯ããã£ã«ã¿ãŒãé 眮ããç¹å¥ãªã¢ãžã¥ãŒã«admin.filtersãäœæããŸãã
Filters.jsãã¡ã€ã«ïŒ
'use strict'; angular.module('admin.filters', []) .filter('list', function() { return function(value,list) { return list?list[value]: value; }; }) ...
å ¥åé¢æ°ã¯ãçŸåšã®ïŒãã£ã«ã¿ãŒãããïŒèŠçŽ ã®å€ãšãã³ãã³ãä»ããŠãã³ãã¬ãŒãã§æå®ãããè¿œå ãã©ã¡ãŒã¿ãŒãåãåããŸãã ãã£ã«ã¿ãŒãã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ããã«ã¯ãããããå«ãã¢ãžã¥ãŒã«ãã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ã®ãªã¹ãïŒapp.jsãã¡ã€ã«ïŒã«è¿œå ããå¿ èŠããããŸãã
... angular.module('admin', ['admin.services','admin.filters']) ...
list.htmlãã³ãã¬ãŒãã§ããã©ã¡ãŒã¿ãŒïŒç®çã®ãªã¹ãïŒã䜿çšããŠãã£ã«ã¿ãŒåŒã³åºããè¿œå ããŸãã
... <td>{{item.category|list:categories}}</td> <td>{{item.answerer|list:answerers}}</td> ...
ããã§ãå€æŽãå ããŠããŒãžãéå§ãããšãå¿ èŠãªè¡ãæ°å€ã€ã³ããã¯ã¹ã®å Žæã«è¡šç€ºãããŠããããšãããããŸãããåé¡ã¯<tr>èŠçŽ ã®æšæºãã£ã«ã¿ãŒãã£ã«ã¿ãŒããããã®è¡ã«ã€ããŠäœãç¥ããªãããšã§ããããŒã¿ã é©åã«ãã£ã«ã¿ãªã³ã°ããããã«ãfilters.jsãã¡ã€ã«ã«ãè¿œå ããŠå¥ã®ãã£ã«ã¿ãŒãäœæããŸãã
... .filter('filterEx', function() { var find = function(arr,name) { for(var i=0; i<arr.length; i++) if (arr[i].name==name) return arr[i].list; }; return function(items,tablehead,str) { if (!str) return items; var result = [], list, ok, regexp = new RegExp(str,'i'); for (var i in items) { ok = false; for (var k in items[i]) if (items[i].hasOwnProperty(k) && k[0]!='$') { list = find(tablehead,k); if (list && regexp.test(list[items[i][k]]) || regexp.test(items[i][k])) {ok = true; break;} } if (ok) result.push(items[i]); } return result; }; });
ãããŠãlist.htmlãã³ãã¬ãŒãã«ãã®ãã£ã«ã¿ãŒãžã®åŒã³åºããè¿œå ããŸãã
... <tr ng-repeat="item in items | filterEx:tablehead:filterStr"> ...
ãã£ã«ã¿ãŒã³ãŒãã¯éåžžã«åçŽã§ã3ã€ã®ãã©ã¡ãŒã¿ãŒïŒæååã®é åãšãã³ãã¬ãŒãã«ãªã¹ããããŠãã2ã€ã®å€æ°ïŒãšããŒãã«ããããšæ€çŽ¢ããæååãå¿ èŠã§ãã 次ã«ãã«ãŒãå ã§ãé åã®ãã¹ãŠã®èŠçŽ ãšã¬ã³ãŒãå ã®ãã¹ãŠã®ããŒãå埩åŠçããã¬ã³ãŒãã®ãã¹ãŠã®èŠçŽ ã«ç®çã®æååãååšãããã©ãããèŠåæ§ã§ç¢ºèªããŸããããŒãã«ãããé åã®èŠçŽ ã«ãªã¹ããæå®ãããŠããå Žåã¯ããã®å€ã䜿çšãããŸã ãŸããæååã®é åãæã€ãªã¹ãããŒãå¿ èŠãªèŠçŽ ïŒcontrollers.jsãã¡ã€ã«ïŒã«è¿œå ããŠãããŒãã«ãããé åã«å€æŽãå ããããšãå¿ããªãã§ãã ããã
... $scope.tablehead = [ {name:'title', title:""}, {name:'category', title:"", list:$scope.categories}, {name:'answerer', title:" ", list:$scope.answerers}, ...
ããã§åºæ¬çãªéšåã¯çµãããã¢ããªã±ãŒã·ã§ã³ã¯ãã§ã«ããªãæ©èœããŠããŸãã ããã¯ãšã³ãã®éçºã¯å€§æ¬åŒ§ã®åŸãã«ä»»ããŸãããã¹ãŠã¯ããªãç°¡åã§ãã
ãããã£ãŠãAngularJsãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠã管çããŒãžã®åºæ¬æ©èœã®äœæãæ€èšããŸããã èšäºä»¥å€ã§ã¯ãããŒãã«ã®äžŠã¹æ¿ããšããŒãžããŒã·ã§ã³ãæ®ã£ãŠããŸãã å°æ¬ãããhabrasocietyãç§ã®æ¬²æããµããŒãããŠããå Žåãç§ã¯ããã«ã€ããŠæ¬¡ã®èšäºãæžããããšæããŸããã
åäœãããã¢ã¯ããããå ¥æã§ããŸãïŒ http : //lexxpavlov.com/ng-admin/v1/ ïŒèªã¿åãå°çšïŒ
ãœãŒã¹ã¯GitHubã§è¡šç€ºã§ããŸãïŒ https : //github.com/lexxpavlov/angular-admin
第äºéš