
æè¿ãiPhoneãšAndroidã¢ããªã±ãŒã·ã§ã³ã®éçºãšãã課é¡ã«çŽé¢ããŸããã iOSã®éçºçµéšããªãã£ãã®ã§ãäžåºŠæžããŠäž¡æ¹ã®ãã©ãããã©ãŒã ã§å®è¡ãããã£ãã ãããã£ãŠãJavascriptãšPhoneGapãéžæãããŸããã
ãŸããèšèªãæ¯èŒçè¿
éã«æ±ºå®ããå Žåãå€ãã®è³ªåããããŸããã
IOS7ã€ã³ã¿ãŒãã§ãŒã¹ãå¯èœãªéãç¹°ãè¿ããã¢ããªã±ãŒã·ã§ã³ã®é床ããã€ãã£ãã®ããã«ãããã£ãã®ã§ãã åæã«ãäžæ¹ã§ã¯ãdojoãjquery mobileã«äŒŒããã¢ã³ã¹ã¿ãŒãã䜿çšããããšããæ¬²æ±ããããŸããã§ããã äžæ¹ã䟿å©ãªã¢ãžã¥ã©ãŒMVCã¢ããªã±ãŒã·ã§ã³æ§é ãååŸãããã£ãã®ã§ãã
ãã®çµæãç§ã®å人çãªæ¯èŒã®æ±ºåæŠã¯æ¬¡ã®ããã«ãªããŸããã
-
ã€ãªã³ãã¬ãŒã ã¯ãŒã¯ïŒ http : //ionicframework.com/-Framework7ïŒ http : //www.idangero.us/framework7/Ionikã¯æåãããã¥ã¡ã³ããç°¡åãªäŸãAngularJsã®äœ¿ãæ
£ããã³ãŒãæ§é ã奜ãã§ããã ããããã¢ããªã±ãŒã·ã§ã³ãæåã«äœæããããšããåŸã倱æããããŸããã Iphone5ã§èµ·åãããã·ã³ãã«ãªã¢ããªã±ãŒã·ã§ã³ã¯é
ãã£ãã ãã¿ã³ãŸãã¯ããã²ãŒã·ã§ã³ãã¯ãªãã¯ãããšãæŒããŠããããªã¬ãŒãããŸã§ã®éã«èŠèŠçã«é
å»¶ãç®ç«ã¡ãŸããã ã¯ãªãã¯æã®300ããªç§ã®é
å»¶ã«äŒŒãŠããŸãã ããããäœæè
ã«ãããšã圌ãã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãfastclickã©ã€ãã©ãª...ã¹ãã¬ã³ãžã®ç¬èªã®å®è£
ãå«ãŸããŠããŸãã ãŸããåçŽãªã¢ããªã±ãŒã·ã§ã³ã§ãã£ãŠããã¢ãã¡ãŒã·ã§ã³ã®ã¹ããŒããŠã³ã¯æã
é¡èã§ããã ãã®çµæãããã¥ã¡ã³ããšãã¹ãã±ãŒã¹ãæ°æ¥éèªãã åŸãä»ã®äœããæ¢ãå¿
èŠãããããšã«æ°ä»ããŸããã
ãã®åŸãFramework7ã«æ»ããŸããã ãã¹ãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããããã³ã·ã³ã¯ã®ã³ã³ããŒãã³ããèŠãŠãæåã¯ããã广ãçµéšããŸããã iPhoneã§ã¯ããã¹ãŠãé«éã§çŸããããã€ãã£ãã«éåžžã«äŒŒãŠããŸãã åæã«ã次ã®2ã€ã®å€§ããªæ¬ ç¹ã«çŽé¢ããŸããã
- åœæãããã¥ã¡ã³ãã¯ã»ãšãã©ãããŸããã§ããã ä»ã§ã¯æ¢ã«ããªã詳现ã«ãªã£ãŠããŸãïŒ http://www.idangero.us/framework7/docs/ ïŒã
- ãã¹ãŠã®äŸã§ãã³ãŒãã¯jqueryã®ãããªåœ¢åŒã®åäžã®ã·ãŒããã¡ã€ã«ã«ãããŸããã åæã«ãã¢ãžã¥ãŒã«æ§ãåå¥ã®ãã¡ã€ã«ããã®ãã³ãã¬ãŒãã®ããŒããªã©ããããŸããã§ããã
äžè¬ã«ãç§ã¯çè«çãªç¥èãåŒãåºããããŸããŸãªèšäºãäŸãèŠãŠãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãäœæããããã®Framework7ãšã¢ãžã¥ã©ãŒMVCã¢ãããŒããçµã¿åãããåé¡ã解決ããããšãã§ããŸããã ã¢ãžã¥ãŒã«ã®éåæããŒããå®è£
ããããã«ãRequireJsããã³ãã¬ãŒãïŒãã³ãã«ããŒïŒã«äœ¿çšããŸããã
ãããã£ãŠãç§ã¯ããã€ãã®ã±ãŒã¹ã¹ã¿ãã£ãäœæããã³ãã¥ããã£ã§å
±æããããšèããŠããŸãã åå¿è
ã®éçºè
ãšããã®ãã¬ãŒã ã¯ãŒã¯ããŸã ç¥ããªãçµéšè±å¯ãªéçºè
ã®äž¡æ¹ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
ã¯ããã«
äœæ¥ã«ã¯ã次ã®ã©ã€ãã©ãªãå¿
èŠã§ãã
ãããžã§ã¯ãæ§é

ãããžã§ã¯ããã¡ã€ã«ã®æ¬¡ã®æ§é ãäœæããŸãïŒindex.htmlããã³app.jsãã¡ã€ã«ã¯ä»ã®ãšãã空ã®ãŸãŸã«ããŸãïŒ
ããªãã®äººçãç°¡çŽ åããããã«ã次ã®ãªã³ã¯ã®æ§é ãæã€ã¢ãŒã«ã€ããããŠã³ããŒãã§ããŸãã
DropboxïŒindex.htmlããã³app.jsãã¡ã€ã«ã®æåã®ããŒãžã§ã³ã¯ããã§ã«ãã®ã¢ãŒã«ã€ãã«æžã蟌ãŸããŠããŸãïŒ
ãŸããããã«Githubã®ãœãŒã¹ãžã®ãªã³ã¯ãæäŸããŸã-ææ°ããŒãžã§ã³ã𿮵éçãªç·šéå±¥æŽããããŸã-ãã®ãã¹ãã¢ããªã±ãŒã·ã§ã³ã®äœæïŒ
https://github.com/philipshurpik/Framework7-MVC-baseæãç°¡åãªindex.htmlãã¡ã€ã«ãäœæããŠãå¿
èŠãªãã¹ãŠã®ã©ã€ãã©ãªãæ¥ç¶ããŸãã
<!DOCTYPE html> <html class="with-statusbar-overlay"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <title>F7 Contacts MVC</title> <link rel="stylesheet" href="lib/css/framework7.css"> <link rel="stylesheet" href="lib/css/ionicons.css"> <link rel="stylesheet" href="css/app.css"> </head> <body> <div class="statusbar-overlay"></div> <div class="views"> <div class="view view-main navbar-fixed"> <div class="navbar"> <div class="navbar-inner"> <div class="left"></div> <div class="center" style="left:22px">Contacts</div> <div class="right"> <a href="contact.html" class="link icon-only"><i class="icon icon-plus">+</i></a> </div> </div> </div> <div class="pages"> <div data-page="list" class="page"> <div class="page-content"> <div class="list-block contacts-list"> <ul> <a href="contact.html" class="item-link item-content"> <div class="item-media"><i class="icon ion-ios7-person"></i></div> <div class="item-inner"> <div class="item-title">Andrey Smirnov</div> </div> </a> <a href="contact.html?id={{id}}" class="item-link item-content"> <div class="item-media"><i class="icon ion-ios7-person"></i></div> <div class="item-inner"> <div class="item-title">Olga Kot</div> </div> </a> </ul> </div> </div> </div> </div> </div> </div> </body> </html> <script type="text/javascript" src="lib/framework7.js"></script> <script type="text/javascript" src="app.js"></script>
ãŸããapp.jsãã¡ã€ã«ã«ã¢ããªã±ãŒã·ã§ã³ã®åæåãé
眮ããŸãã
var f7 = new Framework7({ modalTitle: 'F7-MVC-Base', animateNavBackIcon: true }); var mainView = f7.addView('.view-main', { dynamicNavbar: true });
次ã®å³ãå®è¡ããŠååŸããŸãã

ããã æåã®ããŒãžãããããã®äžã«hello-world以äžã®ãã®ããããŸãã
ã¯ãã誰ãç¥ããªãå Žåã Devtools Chromeã®ã³ã³ãœãŒã«ã®æšªã«ãã[ãšãã¥ã¬ãŒã·ã§ã³]ã¿ãã§ã¯ãç®çã®ããã€ã¹ãéžæãããã®ããã€ã¹ã®ç»é¢ã§ã¢ããªã±ãŒã·ã§ã³ãã©ã®çšåºŠè¡šç€ºããããã確èªã§ããŸãã
RequireJãšãã³ãã«ããŒãæ¥ç¶ããã³ã³ã¿ã¯ããããŒãããŸã
次ã«ãé£çµ¡å
ãåçã«ïŒããšãã°localstorageããïŒããŒããããªã¹ãã«è¡šç€ºããå¿
èŠããããŸãã
ãããè¡ãã«ã¯ããã¡ã€ã«ã倿ŽããŸãã
1. index.htmlapp.jsãã¡ã€ã«ã®çŽæ¥æ¥ç¶ãRequire.Jsæ¥ç¶ã«çœ®ãæããŸã
<script data-main="app" src="lib/require.js"></script>
data-main屿§ã¯ãã¢ããªã±ãŒã·ã§ã³ãžã®ãšã³ããªãã€ã³ããæããŸãïŒããã¯app.jsãã¡ã€ã«ã§ãïŒïŒ
ulã¿ã°ã®å
åŽã«ãããã®ãåé€ããããšãã§ããŸã-ãªã¹ãã®å
åŽã¯ãã³ãã¬ãŒãã䜿çšããŠçæãããŸãã
2. app.jsRequireJsã¢ãžã¥ãŒã«ã§ãã¡ã€ã«ãããçŽããŸãã
define('app', ['js/list/listController'], function(listController) { var f7 = new Framework7({ modalTitle: 'F7-MVC-Base', animateNavBackIcon: true }); var mainView = f7.addView('.view-main', { dynamicNavbar: true }); listController.init(); return { f7: f7, mainView: mainView }; });
ãã¹ãŠåãã§ãããã¢ãžã¥ãŒã«ã«ã©ãããããã ãã§ããŸã å©çšã§ããªãæåã®ã³ã³ãããŒã©ãŒã®ããŠã³ããŒãã远å ãããŸããã
ã¡ã€ã³ããŒãžïŒã³ã³ãããŒã©ãŒããã¥ãŒãèŠçŽ ãã³ãã¬ãŒã
次ã«ãã¡ã€ã³ããŒãžããã®ãã¬ãŒã³ããŒã·ã§ã³ãããã³ãã³ãã«ããŒãã³ãã¬ãŒãçšã®ã³ã³ãããŒã©ãŒãäœæããå¿
èŠããããŸãã
次ã®ããã«ãã¡ã€ã«ã«ååãä»ããŠé
眮ããããšãææ¡ããŸãã

ã¯ãããã®ãããªã°ã«ãŒãåã¯ãæ©èœã®é¢ã§ããã¥ãŒãã¢ãã«ãã³ã³ãããŒã©ãŒãå¥ã®ãã£ã¬ã¯ããªã«é
眮ãããããããããžã§ã¯ãã§ã¯ã¯ããã«äŸ¿å©ãªããã§ãã
ãªã¹ãçšã®ã·ã³ãã«ãªã³ã³ãããŒã©ãŒãäœæããŸãã ãã®äžã§ãããã«localstorageãããã€ãã®é£çµ¡å
ãªããžã§ã¯ãã§åæåããŸãïŒ
ãã¡ã€ã«ïŒjs / list / listController.js define(["js/list/listView"], function(ListView) { function init() { var contacts = loadContacts(); ListView.render({ model: contacts }); } function loadContacts() { var f7Base = localStorage.getItem("f7Base"); var contacts = f7Base ? JSON.parse(f7Base) : tempInitializeStorage(); return contacts; } function tempInitializeStorage() { var contacts = [ {id: "1", firstName: "Alex", lastName: "Black", phone: "+380501234567" }, {id: "2", firstName: "Kate", lastName: "White", phone: "+380507654321" } ]; localStorage.setItem("f7Base", JSON.stringify(contacts)); return JSON.parse(localStorage.getItem("f7Base")); } return { init: init }; });
ãŸãããã³ãã¬ãŒãã䜿çšããŠããŒã¿ïŒåæåæã«æž¡ãïŒã®ã¬ã³ããªã³ã°ãè¡ããã¥ãŒã远å ããå¿
èŠããããŸãã
ãã¡ã€ã«ïŒjs / list / listView.js define(['hbs!js/list/contact-list-item'], function(template) { var $ = Framework7.$; function render(params) { $('.contacts-list ul').html(template(params.model)); } return { render: render }; });
ãŸããåçŽãªãã³ãã¬ãŒãã®ã³ãŒãïŒ
ãã¡ã€ã«ïŒjs / list / contact-list-item.hbs {{#.}} <a href="contact.html?id={{id}}" class="item-link item-content"> <div class="item-media"><i class="icon ion-ios7-person"></i></div> <div class="item-inner"> <div class="item-title">{{firstName}} {{lastName}}</div> </div> </a> {{/.}}
ç§ãã¡ã¯ãã¹ãŠãéå§ããŸãããã¢ãžã¥ãŒã«åãããã¯ããã«æ¡åŒµå¯èœã§ãã
次ã«ãé£çµ¡å
ã衚瀺ããã³ç·šéããããã®ããŒãžã远å ããå¿
èŠããããŸãã
Framework7ã®ããŒãžéã®é²èЧ
åããŒãžã¯åå¥ã®htmlãã¡ã€ã«ã«é
眮ãããŸãã
ããŒãžã¯div c class =â pageâå
ã«å«ãŸããŠããŸã
<div class="page" data-page="list">
data-page屿§ã¯ãä»åŸã«ãŒãã£ã³ã°ã«å¿
èŠãšãªãäžæã®ããŒãžåãå®çŸ©ããŸãã
ããŒãžã®ãã¹ãŠã®èŠèŠèŠçŽ ãå
éšã«é
眮ããå¿
èŠããããŸãã
<div class="page-content"> <div class="page">
ããŒãžéã®ããã²ãŒã·ã§ã³ã¯ãHTMLãªã³ã¯ãã¯ãªãã¯ããŠå®è¡ãããŸãã
<a href="about.html">Go to About page</a>
jsã³ãŒãããïŒ
app.mainView.loadPage('about.html');
ïŒã¢ãã¡ãŒã·ã§ã³ãšãšãã«ïŒæ»ãããã²ãŒã·ã§ã³ãåæ§ã«å®è¡ãããŸãã
ãŸãã¯ãbackã¯ã©ã¹ããªã³ã¯ã«è¿œå ããããšã«ããïŒ
<a href="index.html" class="back"> Go back to home page </a>
ãŸãã¯ãjsã³ãŒãããïŒ
app.mainView.goBack();
ããŒãžãåãæ¿ãããšãFramework7ã¯æ¬¡ã®ãµãã¹ã¯ã©ã€ãå¯èœãªã€ãã³ããçæããŸãã
PageBeforeInitãPageInitãPageBeforeAnimationãPageAfterAnimationãPageBeforeRemove
ããã§ããŒãžãšã€ãã³ãã®å®å
šãªæ
å ±ïŒ
http://www.idangero.us/framework7/docs/pages.htmlhttp://www.idangero.us/framework7/docs/linking-pages.htmlrouter.jsãäœæãã
DOMã«æ°ããããŒãž-PageBeforeInitãæ¿å
¥ããåŸã«çºçããã€ãã³ãã䜿çšããŸãã
ç°¡åãªã«ãŒã¿ãŒïŒrouter.jsãã¡ã€ã«ïŒãäœæããjsãã©ã«ããŒã«é
眮ããŸãããã®ãã©ã«ããŒã§pageBeforeInitã€ãã³ãããµãã¹ã¯ã©ã€ãããŸãã
define(function() { var $ = Framework7.$; function init() { $(document).on('pageBeforeInit', function (e) { var page = e.detail.page; load(page.name, page.query); }); } function load(controllerName, query) { require(['js/' + controllerName + '/'+ controllerName + 'Controller'], function(controller) { controller.init(query); }); } return { init: init, load: load }; });
ã€ãã³ããããªã¬ãŒããããšãRequireã䜿çšããŠå¿
èŠãªã³ã³ãããŒã©ãŒã¢ãžã¥ãŒã«ãããŒãããŠåæåããããŒãžãéããããªã¯ãšã¹ããã©ã¡ãŒã¿ãŒãæž¡ããŸãã
app.jsã¢ãžã¥ãŒã«ãåå®è¡ããã«ãŒã¿ãŒã®åæåã远å ããŠãã³ã³ãããŒã©ãŒã®æ¥ç¶ãšåæåãåé€ããŸãã
define('app', ['js/router'], function(Router) { Router.init(); var f7 = new Framework7({ modalTitle: 'F7-MVC-Base', animateNavBackIcon: true }); var mainView = f7.addView('.view-main', { dynamicNavbar: true }); return { f7: f7, mainView: mainView, router: router }; });
ããã§ãã¡ã€ã³ããŒãžãDOMã«æ¿å
¥ããåŸãæåã«ã¢ããªã±ãŒã·ã§ã³ãããŒããããšãpageBeforeInitã€ãã³ããã³ãã©ãŒãçºçããŸãã
åæã«ããã®e.detail.page.nameããããã£ã¯listãã€ãŸããããã§data-pageããããã£ã§èšå®ããããã®ãšçãããªããŸãããããã£ãŠã察å¿ããã³ã³ãããŒã©ãŒãèµ·åãããŸãã
é£çµ¡å
ç·šéããŒãž
次ã«ãé£çµ¡å
ã远å ããã³ç·šéããããã®ããŒãžãäœæããå¿
èŠããããŸãã
contact.htmlãã¡ã€ã«ãhtmlãããžã§ã¯ãã®ã«ãŒãã«è¿œå ããŸãïŒãã¡ã€ã«æ§é ãã¢ãŒã«ã€ãããããŠã³ããŒãããå Žåãæ¢ã«ããã«ããã¯ãã§ãïŒ
contact.htmlãžã®å¯Ÿå¿ãããªã³ã¯ã¯ãã¡ã€ã³ããŒãžã®navbarããã³é£çµ¡å
ãªã¹ãèŠçŽ ã®ãªã¹ãã«æ¢ã«è¿œå ãããŠããŸãã
<div class="navbar"> <div class="navbar-inner"> <div class="left sliding"> <a href="#" class="back link"> <i class="icon icon-back-white"></i> <span>Back</span> </a> </div> <div class="center contacts-header"></div> <div class="right contact-save-link"> <a href="#" class="link"> <span>Save</span> </a> </div> </div> </div> <div class="pages"> <div data-page="contact" class="page contact-page"> </div> </div>
ããã§ããªã¹ãé
ç®ãŸãã¯è¿œå ãã¿ã³ãã¯ãªãã¯ãããšãã«ãŒã¿ãŒã¯js / contact / contactControllerãã¡ã€ã«ãããŠã³ããŒãããããšããŸãã
ãããã£ãŠãããŒãžã®ãã¬ãŒã³ããŒã·ã§ã³ãšããŒãžã®ãã³ãã¬ãŒãã³ã³ãã³ããäœæããå¿
èŠããããŸãã ãã®ããã«ïŒ

contactController.jsãã¡ã€ã«ã®å
容ïŒ
define(["app","js/contact/contactView"], function(app, ContactView) { var state = {isNew: false}; var contact = null; function init(query){ if (query && query.id) { var contacts = JSON.parse(localStorage.getItem("f7Base")); for (var i = 0; i< contacts.length; i++) { if (contacts[i].id === query.id) { contact = contacts[i]; state.isNew = false; break; } } } else { contact = { id: Math.floor((Math.random() * 100000) + 5).toString()}; state.isNew = true; } ContactView.render({ model: contact, state: state }); } return { init: init }; });
ããŒãžãç·šéã¢ãŒãã®å ŽåïŒã¯ãšãªã«é£çµ¡å
IDå€ãå«ãŸããŠããå ŽåãlocalStorageããååŸããŸãïŒã
ããã§ãªãå Žåã¯ãæ°ãããã®ãäœæããŸãã ãããŸã§ã®ãšãããç°¡åã«ããããã«ãã¢ãã«ã¯äœ¿çšããŠããŸããããã®ãããé£çµ¡å
ã¯åãªããªããžã§ã¯ãã§ãã
contactView.jsãã¥ãŒããŒãžïŒ
define(['hbs!js/contact/contact'], function(viewTemplate) { var $ = Framework7.$; function render(params) { $('.contact-page').html(viewTemplate({ model: params.model })); $('.contacts-header').text(params.state.isNew ? "New contact" : "Contact"); } return { render: render } });
ãããŠãcontact.hbsãã³ãã¬ãŒãïŒ
<div class="page-content"> <form id="contactEdit" class="list-block"> <ul> <input name="id" type="hidden" value="{{model.id}}"> <li> <div class="item-content"> <div class="item-media"><i class="icon ion-ios7-football-outline"></i></div> <div class="item-inner"> <div class="item-input"> <input name="firstName" type="text" placeholder="First name" value="{{model.firstName}}"> </div> </div> </div> </li> <li> <div class="item-content"> <div class="item-media"><i class="icon ion-ios7-football-outline"></i></div> <div class="item-inner"> <div class="item-input"> <input name="lastName" type="text" placeholder="Last name" value="{{model.lastName}}"> </div> </div> </div> </li> <li> <div class="item-content"> <div class="item-media"><i class="icon ion-ios7-telephone-outline"></i></div> <div class="item-inner"> <div class="item-input"> <input name="phone" type="tel" placeholder="Phone" value="{{model.phone}}"> </div> </div> </div> </li> </ul> </form> </div>
ããã ããã§ãé£çµ¡å
ã远å ãŸãã¯ç·šéããããã®ããŒãžãéãããšãã§ããŸãã

é£çµ¡å
ãä¿åããã³åé€ããæ©èœã远å ããå¿
èŠããããŸãã
ä¿åããããšããå§ããŸãããã
é£çµ¡å
ãä¿åãã
ãŸããä¿åãã¿ã³ãã³ãã©ãŒã远å ããŸãã
ãã¡ãããæ¬¡ã®ããã«ã³ã³ãããŒã©ãŒã§çŽæ¥ãããè¡ãããšãã§ããŸãã
$('.contact-save-link').on('click', function() {
ãã ããããã¯è¯ããããŸãããDOMã䜿çšããŠäœæ¥ãåé¢ããããŒã¿ãšã¢ãã«ã䜿çšããããšããå§ãããŸãã
ãããã£ãŠãã€ãã³ãåŠçã®ãµãã¹ã¯ãªãã·ã§ã³ãšåŠçèªäœãåé¢ããŸãã
ã³ã³ãããŒã©ãŒã§ã¯ããã€ã³ãã£ã³ã°ã®é
åãäœæããŸãã
var bindings = [{ element: '.contact-save-link', event: 'click', handler: saveContact }];
ãã®é
åãparamsãªããžã§ã¯ãã®ããããã£ã®1ã€ãšããŠãã¥ãŒã«æž¡ããŸãããã
ãããŠããã³ãã©ãŒé¢æ°ã远å ããŸãã
function saveContact() {
ãããŠããã¥ãŒã§ããã®æ§æã®ã€ãã³ãã«ãã€ã³ãã远å ããŸã-bindEvents颿°ïŒ
function bindEvents(bindings) { for (var i in bindings) { $(bindings[i].element).on(bindings[i].event, bindings[i].handler); } }
ãããŠãrender颿°ããã®åœŒå¥³ã®åŒã³åºãïŒ
bindEvents(params.bindings);
次ã«ããã©ãŒã ã«å
¥åãããããŒã¿ã®å€ãååŸããå¿
èŠããããŸãã
saveContact颿°ã§ãããè¡ããŸãã
function saveContact() { var contacts = JSON.parse(localStorage.getItem("f7Base")) var newContact = app.f7.formToJSON('#contactEdit'); if (state.isNew) { contacts.push(newContact) } else { for (var i = 0; i< contacts.length; i++) { if (contacts[i].id === newContact.id) { contacts[i] = newContact; break; } } } localStorage.setItem("f7Base", JSON.stringify(contacts)); app.router.load('list'); app.mainView.goBack(); }
ãŸããåä¿¡ããããŒã¿ãlocalStorageã«ããã«ä¿åããŸãã
æåŸã®2è¡ã¯ãåã®ããŒãžïŒãªã¹ãïŒã«æ»ããšãšãã«ãlistControllerã«ããŒã¿ãåèªã¿èŸŒã¿ããŸãã
ä»ã§ã¯ãã¹ãŠãæ©èœããŠããŸãïŒ
ã¢ãã«äœæïŒ
ããããã³ã³ãããŒã©ãŒã§ãã¹ãŠã®ããŒã¿ãåŠçããããšã¯ããŸãè¯ããããŸããã ãŸããããŒã¿æ€èšŒãªã©ã®ç¹å¥ãªæ©èœã远å ããå¿
èŠãããå ŽåããããŸãã
ãããã£ãŠãjs / contactModel.jsãã¡ã€ã«ã«ã¢ãã«ãäœæããŸãã
1ã€ã¯ãæ€èšŒé¢æ°ã远å ããå¥ã®ãªããžã§ã¯ãã®å€ãèšå®ããããšã§ãã
define(['app'],function(app) { function Contact(values) { values = values || {}; this.id = values['id'] || Math.floor((Math.random() * 100000) + 5).toString(); this.firstName = values['firstName'] || ''; this.lastName = values['lastName'] || ''; this.phone = values['phone'] || ''; } Contact.prototype.setValues = function(formInput) { for(var field in formInput){ if (this[field] !== undefined) { this[field] = formInput[field]; } } }; Contact.prototype.validate = function() { var result = true; if (!this.firstName && !this.lastName) { result = false; } return result; }; return Contact; });
颿°ã¯ãªããžã§ã¯ãèªäœã«ã¯è¿œå ãããããããã¿ã€ãã«è¿œå ãããããšã«æ³šæããŠãã ããã ãããã£ãŠããªããžã§ã¯ãã転éãŸãã¯ä¿åãããšããã®ããããã£ã®ã¿ã颿°ãªãã§JSONã«è»¢éãããŸãã
次ã«ãã¢ãã«ãcontactControllerã«æ¥ç¶ããŸãã
äŸåé¢ä¿ã®ãªã¹ãã«è¿œå ããŸãã
define(["app","js/contact/contactView", "js/contactModel"], function(app, ContactView, Contact)
init颿°ã§ã¯ãé£çµ¡å
ã®å²ãåœãŠãšäœæããããã倿ŽããŸãã
contact = new Contact(contacts[i]);
ãããŠ
contact = new Contact();
ãããŠãã¢ãã«æ€èšŒã®å®è¡ã远å ããããšã«ãããä¿åæ©èœã倿ŽããŸãã
function saveContact() { var formInput = app.f7.formToJSON('#contactEdit'); contact.setValues(formInput); if (!contact.validate()) { app.f7.alert("First name and last name are empty"); return; } var contacts = JSON.parse(localStorage.getItem("f7Base")); if (state.isNew) { contacts.push(contact); } else { for (var i = 0; i< contacts.length; i++) { if (contacts[i].id === contact.id) { contacts[i] = contact; break; } } } localStorage.setItem("f7Base", JSON.stringify(contacts)); app.mainView.goBack(); app.router.load('list'); }
ä¿åã®æºåãã§ããŸããã
ã¹ã¯ã€ãããŠåé€
é£çµ¡å
ãªã¹ãããã®åé€ã远å ããããã«æ®ããŸãã
ãªã¹ãå
ã®åé€ããã¹ã¯ã€ããžã§ã¹ãã£ãŒã䜿çšããŠãããå®è£
ããŸãã
èŠçŽ ãã³ãã¬ãŒãã®ã¬ã€ã¢ãŠãã倿ŽããŸãã
{{#.}} <li id="{{id}}" class="swipeout"> <a href="contact.html?id={{id}}" class="item-link item-content swipeout-content"> <div class="item-media"><i class="icon ion-ios7-person"></i></div> <div class="item-inner"> <div class="item-title">{{firstName}} {{lastName}}</div> </div> </a> <div class="swipeout-actions"> <div class="swipeout-actions-inner"> <a href="#" class="swipeout-delete">Delete</a> </div> </div> </li> {{/.}}
ã€ãã³ããµãã¹ã¯ãªãã·ã§ã³ãlistControllerã«è¿œå ããŸãã
var bindings = [{ element: '.swipeout', event: 'deleted', handler: itemDeleted }];
ãããŠãé£çµ¡å
ã®ãµãã¹ã¯ãªãã·ã§ã³ãšåæ§ã«ãããè¡ããŸã-ãã¥ãŒã«æž¡ããããã§bindEventsïŒãã€ã³ãã£ã³ã°ïŒé¢æ°ã«ãµãã¹ã¯ã©ã€ãããŸã
ãŸããåé€ã€ãã³ããã³ãã©ãŒã远å ããŸãã
function itemDeleted(e) { var id = e.srcElement.id; var contacts = JSON.parse(localStorage.getItem("f7Base")); for (var i = 0; i < contacts.length; i++) { if (contacts[i].id === id) { contacts.splice(i, 1); } } localStorage.setItem("f7Base", JSON.stringify(contacts)); }
çµæãèŠãŠã¿ãŸãããïŒ


ãããã«
Framework7ã䜿çšããæ¢è£œã®éåžžã«ã·ã³ãã«ãªã¢ãã€ã«MVCã¢ããªã±ãŒã·ã§ã³ããããŸãã
ãŸããFramework7ãšPhonegapãçµã¿åãããããšã«ãããäž»ã«IOSåãã®çŸãããã€ãã£ãã®ãããªã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã ããã¯ãObjectiveCãåããŠäœ¿çšããéçºè
ã«ãšã£ãŠäŸ¿å©ã§ãã
ãã®å ŽåãAndroid 4.4ã§å®å
šãã€ã¹ã ãŒãºã«åäœããã¯ãã¹ãã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³ãããã«åŸãããŸãïŒå°æ¥ã®ããŒãžã§ã³ã§ãåãããã«åäœããå¯èœæ§ãé«ãïŒã
以åã®ããŒãžã§ã³ã®Androidã§äœã³ã¹ãã®Androidããã€ã¹ãéåžžãµããŒãããã«ã¯ã蚱容å¯èœãªUIããã©ãŒãã³ã¹ãåŸãããã«ããŒãžéã®ã¢ãã¡ãŒã·ã§ã³ããªãã«ããã ãã§ååã§ãã
ãããžã§ã¯ããœãŒã¹ãšç·šéã®äžè²«ããå±¥æŽã¯ãããããå
¥æã§ããŸãã
https://github.com/philipshurpik/Framework7-MVC-baseãŸããFramework7ã®ããå€ãã®æ©èœãšããå€ãã®æ©èœã䜿çšããé£çµ¡å
ã¢ããªã±ãŒã·ã§ã³ã®é«åºŠãªãã¬ãŒãã³ã°äŸãäœæããŸããã å·Šã®ãã«ã¢ãŠãã¡ãã¥ãŒããŒããããã¢ããç·šéãæ€çŽ¢ããŒãªã©ã远å ããŸããã
ãã®ãœãŒã¹ã¯æ¬¡ã®ãšããã§ãã
https://github.com/philipshurpik/Framework7-Contacts7-MVCãããŠãããã«ã¹ã¯ãªãŒã³ã·ã§ããããããŸãïŒã·ãŒã«ä»ãïŒïŒ

ãããã®äŸãã圹ã«ç«ãŠã°å¹žãã§ãã
ç§èªèº«ã¯ãããã«ã€ããŠå匷ããã®ã§ããã®èšäºãäœæããããšã«ããŸããã
ç§ã¯è³ªåã«çããŠããããã§ãã
远䌞 ãã®ãã¬ãŒã ã¯ãŒã¯
vladimirkharlampidiã®äœæè
ã¯ãŸã ããã§å©çšã§ããŸãããããããã¯ãhabrovchanã«ãšã£ãŠè峿·±ããã®ã§ããã°ãæåŸ
ãåãå
¥ããŠãã£ã¹ã«ãã·ã§ã³ã«åå ããããšãåãã§ãããšæããŸãã
P.P.S. ãŸããç¹ã«å€ãããŒãžã§ã³ã§ã®Androidã®äœæ¥é床ã«ã€ããŠãå°ã調æ»ããapp.cssã®ãªããžããªã«cssã¢ãã¡ãŒã·ã§ã³ãæé©åããããã®ããã¯ãã¢ããããŒãããŸããã ãããããããã®ããã€ãã¯ããã¬ãŒã ã¯ãŒã¯ã®å°æ¥ã®ããŒãžã§ã³ã«å«ãŸããã§ãããã ãŸããå€å誰ãã圌ãã®ã¢ããªã±ãŒã·ã§ã³ã«åœ¹ç«ã€ã§ãããã