
рд╕рд╛рдЗрдЯреЗрдВ рдмрдирд╛рддреЗ рд╕рдордп, рд╕рдВрдкрд╛рджрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЕрдХреНрд╕рд░ рдЙрдарддрд╛ рд╣реИред рдХрд╛рд░реНрдп, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рддреБрдЪреНрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред
рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЕрд░реНрде рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдФрд░ рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рд╛рдордЧреНрд░рд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рдХрд╛рд░реНрдп рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдЗрд╕реЗ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдарддрд╛ рд╣реИред
рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ jQuery рдХреЗ рддрд╛рд▓рдХ рдкреНрд▓рдЧрдЗрди рдФрд░ рдХрдо рдЬреНрдЮрд╛рдд рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ
DataTables рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдХреБрдЫ рдиреБрдХрд╕рд╛рди рд╣реИрдВред рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХрдард┐рдирд╛рдИ рд╣реИ (рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдирдИ рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдЧрд▓реА рдмрд╛рд░ рдЙрд╕ рддрд░рд╣ рдЦреЛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рддрд╛рд▓рдХ рдЖрдо рддреМрд░ рдкрд░ рдЕрдкрдиреЗ рдХреИрд╢ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рд╛рдзрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдбреЗрдЯрд╛рдЯреЗрдмрд▓реНрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдкреАрдЖрдИ рдмрд▓реНрдХрд┐ рдХреНрд░рд┐рдпрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдП AngularJS рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЬрдирддрд╛ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ, рд╡рд░реНрдЧреАрдХреГрдд рдФрд░ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЗрдЬ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдЦ рдореЗрдВ рдЕрдиреНрдп рд╕рдорд╛рди рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рддреБрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдХреЛрдИ рд╕рд░рд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рднреА рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред
рдореИрдВ рддреБрд░рдВрдд рджреЗ рджреВрдВрдЧрд╛ рдЬреЛ рдЕрдВрдд рдореЗрдВ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп):

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдореИрдВ рдЖрдкрдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рджреВрдВрдЧрд╛ред AngularJS рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ MVC рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ, рдЬреЛ Google рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдкрд┐рдд рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЕрдЬрд╛рдХреНрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдпреВрдирд┐рдЯ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЙрдкрдХрд░рдг рдФрд░ рдИ 2 рдИ-рдкрд░реАрдХреНрд╖рдг (рдпреВрдирд┐рдЯ-рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЬреИрд╕реНрдореАрди, рдПрдВрдб-рдЯреВ-рдПрдВрдб рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред
Aav рдиреЗ рд╣рд╛рд▓ рд╣реА
рдореЗрдВ рдЕрдкрдиреЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ
рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦрд╛
рд╣реИ ред
рдкрд╣рд▓реА рдмрд╛рд░ рдЙрдирд╕реЗ рд▓реЗрдЦ "
7 рдХрд╛рд░рдг рдХреНрдпреЛрдВ рдХреЛрдгреАрдпрдЬреЗрдПрд╕ рд╢рд╛рдВрдд рд╣реИ " рдореЗрдВ рдорд┐рд▓реЗред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ,
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рдЕрд▓рд╛рд╡рд╛ (рд╡реИрд╕реЗ, рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛), рдореБрдЭреЗ рдХреЗрд╡рд▓
рдПрдХ рд▓реЗрдЦ рдорд┐рд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рдХреЗ рд▓рд┐рдП, рдореИрдВ
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджреМрд░реЗ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
AngularJS рдлреНрд░реЗрдорд╡рд░реНрдХ рдореВрд▓ рдмрд╛рддреЗрдВ
рдЖрдЗрдП рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВред Index.html рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдордиреЗ рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рд╣реИ, рд╕рднреА рдХрд╛рдо рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реА рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдореЗрдВ рджреЛ рдмрд┐рдВрджреБ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ - рдПрдирдЬреА-рдРрдк = "рдПрдбрдорд┐рди" <html> рдЯреИрдЧ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ <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 рдЙрдиреНрдирдд рдЯреИрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ - рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╕рдорд╛рди рд╣реИрдВ: рдПрдирдЬреА-рдРрдк = "рдПрдбрдорд┐рди", рдбреЗрдЯрд╛-рдПрдирдЬреА-рдРрдк = "рдПрдбрдорд┐рди", рдФрд░ рдХрдИ рдФрд░ рддрд░реАрдХреЗ рд╣реИрдВред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред
AngularJS рдХрдИ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИред app.js - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди, рд░рд╛рдЙрдЯрд┐рдВрдЧ, рд╕рд░реНрд╡рд┐рд╕реЗрдЬрд╝ .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
рдиреЗ рдЕрдиреБрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП
рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ , рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
aav )ред рдореИрдВ / рд╡рд┐рдЪрд╛рд░ / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реВрдВ (рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ / рд╡рд┐рднрд╛рдЬрди / рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдПрдХ рдХреЗ рд╡рд┐рдкрд░реАрдд)ред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рд╕рдЦреНрдд рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдЬрдЧрд╣ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ 'рд╕рдЦреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ' (
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ)
рдЖрдЧреЗ рдореИрдВ рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рджреВрдВрдЧрд╛, рдЬрд┐рд╕реЗ рд▓реЗрдЦ рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЪрд░рдг-рджрд░-рдЪрд░рдг рд╡рд┐рдХрд╛рд╕ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ред
рдлрд╝рд╛рдЗрд▓ / рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ / рд╕реВрдЪреА.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>
рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП ['рдСрдл', 'рдСрди'] [+ рдЖрдЗрдЯрдо.рд╢рд╛рдЙрди] - рдпрд╣ рдПрд░реЗ ['рдСрдл', 'рдСрди'] рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдЗрдЯрдо рдХреЗ рдореВрд▓реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдЙрди (0 рдпрд╛ 1) рдПрдХрд╛рддреНрдордХ рдСрдкрд░реЗрд╢рди "+" рдПрдХ рд╕рдВрдЦреНрдпрд╛ рджреЗрддрд╛ рд╣реИ - рд╕рд░рдгреА рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХред рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд▓рд╛рдЗрди рдХреЗ рдЪрдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рдЯреНрд░реЗрдирд░ рд╕рд╢рд░реНрдд рдСрдкрд░реЗрдЯрд░ (рдЖрдЗрдЯрдо.рд╢рд╛рдЙрди> 0? 'рдСрди': 'рдСрдл') рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк '' '' 'рдкрд░' '' '' рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛрдЪрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдЖрдЗрдЯрдо рдореЗрдВ рдЖрдЗрдЯрдо рдмрдирд╛рдПрдБ | рдлрд╝рд┐рд▓реНрдЯрд░: рдлрд╝рд┐рд▓реНрдЯрд░рд╕реНрдЯреЛрд░ рдирд┐рд░реНрдорд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЖрдЗрдЯрдо рд╕рд░рдгреА рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлрд┐рд▓реНрдЯрд░рд╕реНрдЯреНрд░ рдЪрд░ рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ (рддрддреНрд╡ рдПрдирдЬреА-рдореЙрдбрд▓ = "рдлрд╝рд┐рд▓реНрдЯрд░рд╕реНрдЯреНрд░реНрд░" рдХреЗ рд╕рд╛рде рддрддреНрд╡ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд)ред
рдЪрд▓реЛ рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдкрд░ рдЬрд╛рдПрдВред рдЬреЗрдПрд╕:
'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; }); }; }
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ: $ рд╕реНрдХреЛрдк - рдмреНрд░реИрдХреЗрдЯреНрд╕ {{}} рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рджрд╛рдпрд░рд╛ рдФрд░ рдПрдирдЬреА-рдореЙрдбрд▓ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ, рдЖрдЗрдЯрдо рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрд╡рд╛рдПрдБ рд╣реИрдВред рд╕реЗрд╡рд╛рдПрдБ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдЖрдЗрдЯрдо рдПрдХ рдкреНрд░рд╢реНрди рдореЙрдбрд▓ рд╣реИ, рдбреЗрдЯрд╛ рд╕реЗрд╡рд╛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ (рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдФрд░ рдЙрддреНрддрд░)ред $ рдЧреБрдВрдЬрд╛рдЗрд╢ рдПрдХ рдРрд╕рд╛ рдЪрд░ рд╣реИ рдЬреЛ рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рджреГрд╢реНрдп рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХрднреА-рдХрднреА рдпрд╣ рдХрд╖реНрдЯрдкреНрд░рдж рднреА рд╣реЛрддрд╛ рд╣реИ)ред рдЯреЗрдмрд▓рд╣реЗрдб рд╕рд░рдгреА рдореЗрдВ рдЯреЗрдмрд▓ рд╣реЗрдбрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдЕрдм 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]; }; });
рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдлрд╝реИрдХреНрдЯрд░реА () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдЬрдирд░реЗрдЯрд░ рд╣реИред рд╕рдВрд╕рд╛рдзрди $ рд╕рдВрд╕рд╛рдзрди рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ XMLHttpRequest рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реАрдХреЗ рдорд┐рд▓рддреЗ рд╣реИрдВ (), рд╕рд╣реЗрдЬреЗрдВ (), рд╣рдЯрд╛рдПрдВ () рдФрд░ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рд░рдЦрд╛рдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╣реИрдВред рд╣рд░ рдмрд╛рд░ рдПрдХреНрд╕реЗрд╕ рд╣реЛрдиреЗ рдкрд░ рдЖрдЗрдЯрдо рд╕реЗрд╡рд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рддреА рд╣реИред рдЬрдм рдкреГрд╖реНрда рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рд╕реЗрд╡рд╛ рднрд░реА рд╣реБрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░ рджреЗрддреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╢ рд╕реЗ рдЬрд╛рд░реА рдХрд░рддреА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ рд╡рд╣ рд╕реВрдЪреА рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдмрд╛рдж рдореЗрдВ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВрдЧреЗред рдЕрдм рдкреНрд░рд╢реНрди рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛
/Views/edit.html рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ
рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╕реАрдПрд╕рдПрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ):
<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 = "рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рдореВрд▓реНрдп (рдХреБрдВрдЬреА, рдореВрд▓реНрдп) рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдВрдЬреА"ред рдЗрд╕рдХреЗ рдмрд╛рдж рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕реНрд░реЛрдд рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдореВрд▓реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдПрдирдЬреА-рдХреНрд▓рд╛рд╕ = "{error: saveForm.titleред $ Invalid}" рдирд┐рд░реНрджреЗрд╢ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреИрдЧ рдХреЛ рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧ рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред SaveForm.titleред $ Invalid == trueред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣рд╛рдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдВрдЬреА рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд╛рдо рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЗрд╕рдХрд╛ рдорд╛рди рд╕рддреНрдп рд╣реИред "рд╕рд╣реЗрдЬреЗрдВ" рдмрдЯрди рдПрдХ рд╕рдорд╛рди рдирд┐рд░реНрджреЗрд╢рд╛рддреНрдордХ рдПрдирдЬреА-рдЕрдХреНрд╖рдо = "saveFormред $ Invalid || saveFormред $ Pristine" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрдЯрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рдкреВрд░реА рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрджрд┐ рдкреНрд░рдкрддреНрд░ рдореЗрдВ рдЕрдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реИрдВ (saveFormред $ Invalid)ред ) рдпрд╛ рдлреЙрд░реНрдо рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИ (saveFormред $ pristine)ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЪреМрдХрд╕ рдкрд╛рдардХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдЧрд╛ <h3> {{["рдкрд░рд┐рд╡рд░реНрдзрди", "рдкрд░рд┐рд╡рд░реНрддрди"] [(рдордж .id> 0) +0]}} рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ </ h3> ...
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк app.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'); }); }; }
рджреЛрдиреЛрдВ рдирд┐рдпрдВрддреНрд░рдХ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИрдВ, рд╡реЗ рдкреГрд╖реНрда рдкрддреЗ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рджрд╛рддрд╛ $ рдорд╛рд░реНрдЧрдкреНрд░реЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдЙрдирдХреЗ рдирд╛рдо рдорд╛рд░реНрдЧ рдореЗрдВ app.js рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ) рдФрд░ рдлрд╝рдВрдХреНрд╢рди $ location.path ('/ рд╕реВрдЪреА') рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдзреНрдпрд╛рди рджреЛ! рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ # рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ 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> рддрддреНрд╡ рдореЗрдВ рдорд╛рдирдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдЗрди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдирдП рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЕрдирдлрд╝рд┐рд▓реНрдЯрд░реНрдб рдХреЗ рд╕рд╛рде рдЖрдкреВрд░реНрддрд┐ рдХреА рдЧрдИ рд╣реИ рдбреЗрдЯрд╛ред рдЙрдЪрд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред 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"> ...
рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЗрд╕рдореЗрдВ рддреАрди рдкреИрд░рд╛рдореАрдЯрд░ - рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдПрдХ рд╕рд░рдгреА рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рджреЛ рдЪрд░ - рдЯреЗрдмрд▓рд╣реЗрдб рдФрд░ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИред рдлрд┐рд░, рдПрдХ рд▓реВрдк рдореЗрдВ, рд╕рд░рдгреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рд╕рднреА рдХреБрдВрдЬрд┐рдпреЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирд┐рдпрдорд┐рддрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЯреЗрдмрд▓рд╣реЗрдб рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ (рдирд┐рдпрдВрддреНрд░рдХреЛрдВ.рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓) рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рд╕реВрдЪреА рдХреБрдВрдЬреА рдЬреЛрдбрд╝рдХрд░ рдЯреЗрдмрд▓рд╣реЗрдб рд╕рд░рдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:
... $scope.tablehead = [ {name:'title', title:""}, {name:'category', title:"", list:$scope.categories}, {name:'answerer', title:" ", list:$scope.answerers}, ...
рдЗрд╕ рдкрд░ рдореВрд▓ рднрд╛рдЧ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЖрд╡реЗрджрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИред рдореИрдВ рдХреЛрд╖реНрдардХ рдХреЗ рдкреАрдЫреЗ рдмреИрдХреЗрдВрдб рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдПрдВрдЧреБрд▓рд░рдЬ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдкреГрд╖реНрда рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЬрд╛рдВрдЪ рдХреАред рд▓реЗрдЦ рдХреЗ рдмрд╛рд╣рд░, рддрд╛рд▓рд┐рдХрд╛ рдЫрдБрдЯрд╛рдИ рдФрд░ рдЕрдВрдХреБрд░рдг рдмрдирд╛ рд░рд╣рд╛ред рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдпрджрд┐ рд╕рдореНрдорд╛рдирдЬрдирдХ рдЖрднрд╛рдордВрдбрд▓ рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдбреЗрдореЛ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ:
http://lexxpavlov.com/ng-admin/v1/ (рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП)
рд╕реВрддреНрд░реЛрдВ рдХреЛ GitHub:
https://github.com/lexxpavlov/angular-admin рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рджреВрд╕рд░рд╛ рднрд╛рдЧ