
ãã¹ãŠã®è¯ãäžæ¥ã
base.jsã§ã®é«åºŠãªåäžããŒãžã¢ããªã±ãŒã·ã§ã³ã®äœæã«é¢ããè峿·±ãäžé£ã®èšäºãç¶ããŸãã
ååã¯ãã³ã¬ã¯ã·ã§ã³ã®æäœæ¹æ³ãåŠã³ãå®å
šãªã€ã³ã¿ã©ã¯ãã£ããªã¹ããå®è£
ããŸããã
ä»åã¯ãVKontakteåãã®æ¬æ Œçãªã¯ã©ã€ã¢ã³ãã®äœæãéå§ããŸãã
ã€ãŸããæ¿èªããã¥ãŒã¹ãå人ã鳿¥œã®ããŠã³ããŒããå®è£
ããŸãã
ã¡ãã¥ãŒãšããã²ãŒã·ã§ã³
ãŸããã¿ã€ãã«ãšã¡ãã¥ãŒãåããã·ã³ãã«ãªããŒãžãå®è£
ããŸãã
ã¡ãã¥ãŒé
ç®ïŒã¿ãïŒãã¯ãªãã¯ãããšãå¥ã®URLã«ç§»åããã¢ã¯ãã£ããªã¡ãã¥ãŒé
ç®ã匷調衚瀺ããŸãã
å°æ¥ã®ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ãã¡ã€ã«ã®ã³ãŒããèŠãŠã¿ãŸãããã
let Node = require('basis.ui').Node; let Header = require('app.ui.header.component'); let Menu = require('app.ui.menu.component'); require('basis.app').create({ title: 'VK Client by Basis.JS', element: new Node({ template: resource('./template.tmpl'), binding: { header: 'satellite:', menu: 'satellite:' }, satellite: { header: Header, menu: Menu } }) });
å¿
èŠãªã¢ãžã¥ãŒã«ãæ¥ç¶ããŸãïŒ
Node ãããããŒãšã¡ãã¥ãŒã³ã³ããŒãã³ãïŒä»¥äžã§æ€èšããŸãïŒã
次ã«ã
basis.app.createïŒïŒã¡ãœããã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã ãã¡ãããããã䜿çšããã«ã以åãšåãããã«å®è¡ã§ããŸããæ°ãã
ããŒããäœæããããŒãžäžã®ããã€ãã®èŠçŽ ã«é
眮ããŸãã
ãã ããbasis.jsã«ã¯ãããŒãžã¿ã€ãã«ãšããŒãžäžã®ã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã³ã³ããŒãã³ãã®é
眮ã«é¢é£ããããžãã¯ãã«ãã»ã«åãããbasis.appãã«ããŒããããŸãã
ãŸããã¢ããªã±ãŒã·ã§ã³ã®ãã³ãã¬ãŒããèŠãŠãã ããïŒ
<div class="container"> <hr/> </div>
ã¿ã€ãã«ãšã¡ãã¥ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã³ã³ããŒãã³ãã®
ãµãã©ã€ãã§ãã
çŸæç¹ã§ã¯ãããããŒã³ã³ããŒãã³ãã¯éåžžã«åçŽã§ãã
let Node = require('basis.ui').Node; module.exports = Node.subclass({ template: resource('./template.tmpl')
圌ã®ä»äºã¯æšæ¶ãããããšã§ãã åŸã§æ¹åããŸãã
ããããã¡ãã¥ãŒã³ã³ããŒãã³ãã¯ç¹ã«è峿·±ããã®ã§ãã
let Node = require('basis.ui').Node; let Value = require('basis.data').Value; let router = require('basis.router'); let currentPage = Value.from(router.route(':page').param('page')); module.exports = Node.subclass({ template: resource('./template.tmpl'),
ããã«
currentPage倿°ã®å
å®¹ã«æ³šç®ããŸãããã
çŸåšã®ã«ãŒãã¯åžžã«ããã«ä¿åããã倿Žã远跡ã§ããŸãã
ã¡ãã¥ãŒé
ç®ã®
éžæãããããããã£ã§ãã®å€ã䜿çšããŸãã
ã€ãŸããç¹å®ã®ã¡ãã¥ãŒé
ç®ã®ã¢ã¯ãã£ããã£ã¯ãçŸåšã®ã«ãŒãã«äŸåããŸãã
çŸåšã®ã¡ãã¥ãŒé
ç®ã®URLãçŸåšã®ã«ãŒããšäžèŽããå Žåããã®ã¡ãã¥ãŒé
ç®ã¯
selected = trueã§ãã
ãããã£ãŠãäžåºŠã«1ã€ã®ã¡ãã¥ãŒé
ç®ã®ã¿ãéžæãããŸãã
ç¹å®ã®ã¢ã€ãã ãã¯ãªãã¯ãããšãæå®ããURLãžã®ããã²ãŒã·ã§ã³ãçºçããŸãã
ææžã®å¯Ÿå¿ããã»ã¯ã·ã§ã³ã§ã basis.js
ã«çµã¿èŸŒãŸããŠããã«ãŒã¿ãŒã®è©³çްãèªãããšãã§ã
ãŸã ã
次ã«ãã¡ãã¥ãŒé
ç®ãã³ãã¬ãŒããèŠãŠã¿ãŸãããã
<b:define name="active" from="selected" type="bool"/> <button type="button" class="btn btn-default {active}" event-click="click"> {title} </button>
åã¡ãã¥ãŒé
ç®ã¯ãã¿ã³ã§ãã
éžæããã¢ã€ãã ã
trueã®å Žåã
ã¢ã¯ãã£ããªã¯ã©ã¹ããã¿ã³ã«è¿œå ããããã§ãªãå Žåã¯åé€ããŸãã
以äžã§ãã ããã²ãŒã·ã§ã³ä»ãã¡ãã¥ãŒ-å®äºã
ããã§ãã¡ãã¥ãŒé
ç®ãã¯ãªãã¯ãããšã察å¿ããURLãžã®é·ç§»ããããŸãã
ããã©ã«ãã®ã«ãŒãã§ããå°ããªäºçްãªç¹ãæ®ã£ãŠããŸããã
ã«ãŒããæå®ããã«ã¢ããªã±ãŒã·ã§ã³ãåã«éããšãã¡ãã¥ãŒé
ç®ã¯éžæãããŸããã
ããã©ã«ãã«ãŒãã
Newsã«ãªãããã«ä¿®æ£ããŸãããã
ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ãã¡ã€ã«ã倿ŽããŸãã
ã¢ããªã±ãŒã·ã§ã³ãåæåããããšããã«ãã«ãŒãã®å€æŽã®è¿œè·¡ãéå§ããŸãã
ã«ãŒããæå®ãããŠããªãå ŽåããŠãŒã¶ãŒãããã©ã«ãã«ãŒãã«è»¢éããŸãã
ãã°ã€ã³
ããã§ã
VKontakte APIã䜿çšãã
ããã䜿çšããŠæ¿èªãå®è£
ããŸãã
VK APIïŒä»¥éãåã«APIãšåŒã³ãŸãïŒã®
ã©ãããŒãèŠãŠãã ããã å®å
šã«æ€èšããã®ã§ã¯ãªããéèŠãªç¹ã®ã¿ãæ€èšããŸãã
APIèªäœã¯ã
basis.data.Valueã®ç¶æ¿ã§ããããšã«æ³šæããŠãã ããã
ããã¯ãä»ã®ããŒã¿ãœãŒã¹ãšåæ§ã«ãç¶æ
ãããããšãæå³ããŸãã
- ãŠãŒã¶ãŒãèš±å¯ãããŠããªãå Žåã¯æªå®çŸ©
- æ¿èªäžã®åŠç
- èªèšŒæååŸã æºåå®äº
- ãšã©ãŒã®å Žåã®ãšã©ãŒ
ã¢ãã«ã®ç¶æ
ã®å€åãã©ã®ããã«å®è£
ãããããèŠãŠã¿ãŸãããã ãããè¡ãã«ã¯ã
loginïŒïŒããã³
logoutïŒïŒã¡ãœããã䜿çšããŸãã
login() { this.setState(STATE.PROCESSING); this.isLoggedIn().then( () => this.setState(STATE.READY), () => { global.VK.Auth.login(response => { this.setState(response.session ? STATE.READY : STATE.UNDEFINED); }, config.perms); } ); }, logout() { global.VK.Auth.logout(); this.setState(STATE.UNDEFINED); }
loginïŒïŒãåŒã³åºããšãAPIã¯
PROCESSINGç¶æ
ã«ãªããŸãã
次ã¯ãã§ãã¯ã§ã-ãŠãŒã¶ãŒããã§ã«ãã°ã€ã³ããŠããå Žåãããã«APIã
READYç¶æ
ã«ããŸãã ããã§ãªãå Žåã¯ãVK APIã®
VK.Auth.loginïŒïŒã¡ãœããã䜿çšããŠãã°ã€ã³ããŸãã VK APIã«ããèªèšŒããã»ã¹ã¯ããŠãŒã¶ãŒåãšãã¹ã¯ãŒãã®å
¥åãæ±ãããŠã£ã³ããŠã衚瀺ããããšããäºå®ã«åºã¥ããŠããŸãã
ãŠã£ã³ããŠãéãããããšïŒæ¿èªãæåãŸãã¯ãã£ã³ã»ã«ãããïŒã転éããã
ã³ãŒã«ããã¯ãåŒã³åºãããã¢ãã«ã®æçµç¶æ
ãèšå®ãããŸãïŒæ¿èªãæåããå Žåã¯
READY ãæ¿èªããã£ã³ã»ã«ãããå Žåã¯
UNDEFINED ã
logoutïŒïŒãåŒã³åºãããšã«ããã
VK.Auth.logoutïŒïŒã¡ãœããã䜿çšããŠã»ãã·ã§ã³ãç Žæ£ããAPIã
UNDEFINEDç¶æ
ã«ããŸãã
ããã§ã¯ããã1ã€ã®éèŠãªã¡ãœãã
callApiïŒïŒãèŠãŠã¿ãŸãããã
callApi(method, params = {}) { return this.isLoggedIn() .catch(e => Promise.reject(new Error(' !'))) .then( () => { return new Promise((resolve, reject) => { basis.object.complete(params, {v: config.version}); global.VK.api(method, params, response => { if (response.error) { reject(new Error(response.error.error_msg)); } else { resolve(response.response); } }); }); }, e => { this.setState(STATE.ERROR, e.message); throw e; } ); }
ãã®ã¡ãœããã®æ¬è³ªã¯ãVK APIãä»ããŠãªã¯ãšã¹ããéä¿¡ããããšã§ãã åãªã¯ãšã¹ããå®è¡ããåã«ãæ¿èªã®å¯çšæ§ã確èªããŸãã æ¿èªããªãå ŽåïŒããšãã°ã2ã€ã®ãã©ãŠã¶ãŒã¿ãã§ã¢ããªã±ãŒã·ã§ã³ãéãããã®1ã€ã§
çµäºãã¯ãªãã¯ããå ŽåïŒããšã©ãŒãã¹ããŒããAPIã
ERRORç¶æ
ã«ããŸãã ãã¹ãŠãèªèšŒã§åé¡ãªãå Žåããªã¯ãšã¹ããå®è¡ããŸãã ãµãŒããŒããªã¯ãšã¹ããžã®å¿çã§ãšã©ãŒãéç¥ããå Žåããšã©ãŒãã¹ããŒããAPIã
ERRORç¶æ
ã«ããŸãã ãã以å€ã®å Žåã¯ãçµæãè¿ããŸãã
ãã®ãããVK APIã§ã®äœæ¥ã®åŸ®åŠãªéããç¡èŠããŠãã¢ãã«ç¶æ
ã§ã®ã¿æäœã§ããŸãã
let STATE = require('basis.data').STATE; let Value = require('basis.data').Value; let Node = require('basis.ui').Node; let router = require('basis.router'); let Header = require('app.ui.header.component'); let Menu = require('app.ui.menu.component'); let vkApi = require('app.vkApi'); let apiState = Value.state(vkApi); let defaultRoute = 'news'; require('basis.app').create({ title: 'VK Client by Basis.JS', element: new Node({
次ã«ããã³ãã¬ãŒãã«ãããã®ããããã£ãé©çšããŸãã
<div class="container"> <div b:show="{active}"> <hr/> </div> <div class="jumbotron text-center" b:hide="{active}"> <h1> VK Client <small> powered by basis.js</small> </h1> <div class="alert alert-danger" b:show="{error}"> {error} </div> <button class="btn btn-primary btn-lg" event-click="login" disabled="{disabled}"></button> </div> </div>
ãŠãŒã¶ãŒããã°ã€ã³ãããŸã§ããããç»é¢ã衚瀺ããŸããããã§ãªãå Žåã¯ãã¡ãã¥ãŒãšã¿ã€ãã«ã衚瀺ããŸãã
æ¿èªãã¿ã³ã¯ãæ¿èªããã»ã¹äžã¯ãããã¯ãããŸãã
ãŸããã¡ã€ã³ã¡ãã¥ãŒ
ãçµäºãããã¿ã³
ã远å ããŸãã
<div> <div{childNodesElement} class="btn-group btn-group-lg"/> <button class="btn btn-primary btn-lg pull-right" event-click="logout"></button> </div>
ãããŠãã¡ãã¥ãŒã³ã³ããŒãã³ãã§ããã®ãã¿ã³ã®ã¯ãªãã¯ãåŠçããŸãã
let vkApi = require('app.vkApi');
ãããïŒ ããã§ãVKontakteã«ãã°ã€ã³ã§ããã¢ããªã±ãŒã·ã§ã³ãšãã¢ãã«ã®ç¶æ
ã远跡ãã䟿å©ãªã¡ã«ããºã ãã§ããŸããã å
ã«é²ã¿ãŸãã
Pages
ãã®èšäºã®äžéšãšããŠããã¥ãŒã¹ãå人ãé³å£°é²é³ã®3ã€ã®ããŒãžãå®è£
ããŠããŸãã
ã¡ãã¥ãŒé
ç®ãåãæ¿ãããšã察å¿ããããŒãžã衚瀺ãããŸãã
ãŸããä»ã®ãã¹ãŠãç¶æ¿ããå
±æããŒãžãäœæããŸãã
let Value = require('basis.data').Value; let Expression = require('basis.data.value').Expression; let STATE = require('basis.data').STATE; let Node = require('basis.ui').Node; module.exports = Node.subclass({ active: basis.PROXY, binding: { loading: Value.query('childNodesState').as(state => state == STATE.PROCESSING), error: Value.query('childNodesState').as(state => state == STATE.ERROR && state.data), empty: node => new Expression( Value.query(node, 'childNodesState'), Value.query(node, 'childNodes.length'), (state, itemCount) => !itemCount && state == STATE.READY ) }, handler: { activeChanged() { if (this.active) { this.dataSource.deprecate(); } } } });
<div> <div class="alert alert-info" b:show="{loading}">...</div> <div class="alert alert-warning" b:show="{empty}"> </div> <div class="alert alert-danger" b:show="{error}">{error}</div> <div{page} b:hide="{loading}"/> </div>
ããŸããŸã3ã€ã®ããŒãžãã¹ãŠã«å
±éã®äœæ¥ããžãã¯ããããŸãã
- äœãã®ãªã¹ããã¢ããããŒããã
- ã·ã§ãŒã®ç¢æã®ããŒãã£ã³ã°ãããŒããããšã
- ãšã©ãŒè¡šç€ºãšã©ãŒããã¹ãã®å Žå
- 空ã®ãªã¹ããããŒããããŠããå Žåãç¢æãªã¹ãã空ã§ããããšã瀺ããŸã
ååãåããããªããšãããŸããã
3ã€ã®ããŒãžãã¹ãŠã®ã³ã³ããŒãã³ãã§ã³ãŒããè€è£œããªãããã«ãå¥ã®ãã¡ã€ã«ã«é
眮ããŸãã
ããã§äœãèµ·ãããã詳ããèŠãŠã¿ãŸãããïŒ
æœè±¡ããŒãžã¯ãç¹å®ã®ãã€ã³ããŒãšããã€ãã®è©³çްãå«ãåãªã
ããŒãã§ãã
åå詳现ã«èª¿ã¹
ãã®ã§ããããã®ãã€ã³ããŒã«ã€ããŠã¯
ããã§ã¯èª¬æããŸããã
ä»ãç§ãã¡ã¯ä»ã®äœãã«ãã£ãšèå³ãæã£ãŠããŸãã
ã¢ã¯ãã£ããªãã®ã¯
ïŒbasis.PROXY ïŒ
ååãããŒã¿ã»ããã®ç¶æ
ã
UNDEFINEDãŸãã¯
DEPRECATEDã§ãã¢ã¯ãã£ããªã³ã³ã·ã¥ãŒããããå Žåã«ã®ã¿ãããŒã¿ã»ããã®åæãéå§ãããããšãããããŸããã ãããã®2ã€ã®æ¡ä»¶ã¯ããã€ã€ã«ããã»ã¹ãéå§ããããã«å¿
èŠã§ãã ããã§ãã
ã¢ã¯ãã£ããªæ¶è²»è
ããããšã ãã«é¢ããéšåã«ãã£ãšèå³
ããããŸãã
ã³ã³ã·ã¥ãŒããŒã¯ãå¥ã®ããŒã¿ãªããžã§ã¯ãã§è¡šãããããŒã¿ïŒããã«ã¯çŸåšã®ããŒã¿ïŒãå¿
èŠãšãããšã³ãã£ãã£ïŒ
base.data.AbstractDataã®ç¶æ¿
è
ïŒã§ãã
ã¢ã¯ãã£ããªã³ã³ã·ã¥ãŒãã¯ãããããã£ã
active = trueã®ã³ã³ã·ã¥ãŒã
ã§ã ã
ããã©ã«ãã§ã¯ã
dataSourceã
Nodeã«å²ãåœãŠããããšã
Nodeã¯èªåçã«ãã®ã»ããã®ã³ã³ã·ã¥ãŒãã«ãªããŸãã
çŽ æŽããããæ¶è²»è
ãããŸãã ãããã圌ã¯ã¢ã¯ãã£ãã§ããïŒ
ç¹°ãè¿ããŸãããããã©ã«ãã§
㯠ã
Nodeã¯ã¢ã¯ãã£ããªã³ã³ã·ã¥ãŒãã§
ã¯ãããŸããïŒããããã£
active = false ïŒã
ã
ã¢ã¯ãã£ãã远å ããŸããããããŒãã®èª¬æã«trueã远å ãããšãåé¡ã¯è§£æ±ºããŸã ã-ææ¡ã§ããŸãã
ãã¹ãŠãããã»ã©åçŽã§ã¯ãããŸããã ã¹ããŒãã¢ããªã±ãŒã·ã§ã³ãäœæããŠããŸããïŒ ããã¯ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ã»ãããäžåºŠã ãåæããã ãã§ãªããå¿
èŠã«å¿ããŠããŒã¿ãæŽæ°ããå¿
èŠãããããšãæå³ããŸãã
3ã€ã®ããŒãžãšããããã«3ã€ã®ã»ããïŒãã¥ãŒã¹ãå人ãé²é³ïŒããããŸãã ãã®ã»ãããå¿
èŠãšããã¿ãã«ç§»åãããšãã«ã®ã¿ãã»ããã®åæãéå§ããŸãã ãããã£ãŠãããŒã¿ãæŽæ°ããã¡ã«ããºã ãå®è£
ããã ãã§ãªããã
é
å»¶ ãããŒã¿åæã远å ããŸãã ã€ãŸããå¿
èŠãªå Žåã«ã®ã¿åæããŸãã
ããã«åºã¥ããŠãã¿ãã«åãæ¿ãããšãã察å¿ããã»ããã®ç¶æ
ã
DEPRECATEDã«å€æããå¿
èŠããããŸãã
ããããã¿ãã«åãæ¿ãããã©ããã¯ã©ããã£ãŠããããŸããïŒ
ãããããç§ãã¡ã¯å
ã®è³ªåããã©ãã©ãé ããã£ãŠãããšãã§ã«èãå§ããŠããã§ãããã
ããããããã¯ããã§ã¯ãããŸããã ããå°ããããšããã¹ãŠã®ããããã©ã€ã³ãã©ã®ããã«ããŒãžãããããããããå
šäœåãæç¢ºã«ãªããŸãã
ã§ã¯ãã¿ãã«åãæ¿ãããã©ãããã©ã®ããã«ããŠç¥ãã®ã§ããããïŒ
dataSourceãšåæ§ã«ã
Nodeã¯èªåçã«ãã¹ãŠã®ãµãã©ã€ããšãã®ææè
ã®ã³ã³ã·ã¥ãŒãã«ãªããŸãã ã¿ããåãæ¿ãããšãã«ã察å¿ããããŒãžãã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒã
ããŒãã®ãµãã©ã€ãã«ãªãããã«ããŸãã
ãããã£ãŠãããŒãžããµãã©ã€ãã«ãªã£ãæç¹ã§ããŒãžãåå¿ããããã®æç¹ã§ãã®ã»ããã®ç¶æ
ã
DEPRECATEDã«å€æã§ããŸãã
ãããïŒ ããŒãžãã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã³ã³ããŒãã³ãã®ãµãã©ã€ãã«ãªããšãããŒã¿ã»ããã¯
DEPRECATEDç¶æ
ã«ãªããŸãã
ããããããäžåºŠèšããŸããããã
ããŒã¿ã»ããã¯ããã®ç¶æ
ãUNDEFINEDãŸãã¯DEPRECATEDã§ãã¢ã¯ãã£ããªã³ã³ã·ã¥ãŒããããå Žåã«ã®ã¿åæãéå§ããŸãã ã
ã»ããã®åãæ¿ãç¶æ
ãšæ¶è²»è
ã®ååšã«ããããããææ¡ããŸããã ããããã¢ã¯ãã£ããã£ã¯ã©ãã§ããïŒ ããŒãžã«åã«
activeïŒtrueã远å ãããšãããŒãžã¯åžžã«ã¢ã¯ãã£ãã«ãªãããã®ããŒã¿ãœãŒã¹ã¯ããã®ããŒã¿ãå¿
èŠãã©ããã«é¢ä¿ãªããäœæåŸããã«ããŒã¿ã®åæã詊ã¿ãŸãã
åæãåã«äžå¯èœãªå Žåããããããããã¯ç§ãã¡ã«ã¯å®å
šã«é©ããŠããŸããã ããšãã°ãæ¿èªæç¶ãããŸã å®äºããŠããªãå Žåããã€ã³ã¿ãŒããããåæãããŠããå Žåã§ãã
ããŒãžèªäœã§ãããã®ã±ãŒã¹ãåŠçããªãããã«ããã«ã¯ã
activeïŒbase.PROXYããããã£ã远å ããŸããããã«ããã
ããŒãã¯ã
ããŒãèªäœãã¢ã¯ãã£ããªã³ã³ã·ã¥ãŒããæã€å Žåã«ã®ã¿ã¢ã¯ãã£ãã«ãªãç¹å¥ãªã¢ãŒãã«ãªããŸãã
ãããç¥ã£ãŠããã®ã§ã
ownerChangedã远跡ããå¿
èŠã¯ãªãã
activeChangedããµãã¹ã¯ã©ã€ãã
ãŸã ã ãããã£ãŠãã¢ã¯ãã£ããªã³ã³ã·ã¥ãŒãã®åºçŸæã«ã®ã¿ãããŒã¿ãåæããããã«ã»ããã匷å¶ããŸãã
ããŒãžã³ã³ããŒãã³ãã®çµæã®ã³ãŒããããäžåºŠèŠãŠã¿ãŸãããã
let Value = require('basis.data').Value; let Expression = require('basis.data.value').Expression; let STATE = require('basis.data').STATE; let Node = require('basis.ui').Node; module.exports = Node.subclass({ active: basis.PROXY, binding: { loading: Value.query('childNodesState').as(state => state == STATE.PROCESSING), error: Value.query('childNodesState').as(state => state == STATE.ERROR && state.data), empty: node => new Expression( Value.query(node, 'childNodesState'), Value.query(node, 'childNodes.length'), (state, itemCount) => !itemCount && state == STATE.READY ) }, handler: { activeChanged() { if (this.active) { this.dataSource.deprecate(); } } } });
ãããã£ãŠãããŒãžã¯ãã¢ã¯ãã£ããªã³ã³ã·ã¥ãŒããããå Žåã«ã®ã¿ã¢ã¯ãã£ãã«ãªããŸãã
äžèšã®ããã«ãããŒãžã®ã³ã³ã·ã¥ãŒããŒã¯ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãã«ãªããŸããèŠããŠããå Žåã¯ããŠãŒã¶ãŒãæ¿èªããããšãã«ã®ã¿ã¢ã¯ãã£ãã«ãªããŸãã
ããŒãžãã¢ã¯ãã£ãã«ãªããšããã®ããŒã¿ãœãŒã¹ã®ç¶æ
ã¯
DEPRECATEDã«ãªããŸãã
ããã§ãããŸããŸãªã±ãŒã¹ã®åŠçãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã«å§ä»»ããŸããã
ããã§ç»åããããã«ãªããŸãïŒ
- 3ã€ã®ããŒãžïŒãã¥ãŒã¹ãåéãé³å£°ïŒããããŸã
- å幎é
ã®å¥³æ§ã¯ãVK APIã䜿çšããŠããŒã¿ãåä¿¡ã§ããç¬èªã®ããŒã¿ã»ãããæã£ãŠããŸã
- ã¿ããåãæ¿ãããšãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã³ã³ããŒãã³ãã®ãµãã©ã€ãã察å¿ããã¿ãããŒãžã«ãªããŸã
- ããŒãžã¯ãã¢ã¯ãã£ããªã³ã³ã·ã¥ãŒããŒãããå Žåã«ã®ã¿ã¢ã¯ãã£ãã§ã
次ã«ãèæ
®ãããããŒãžã³ã³ããŒãã³ãã®ç¶æ¿è
ã®äœæã«ç§»ããŸãããã
ãã¥ãŒã¹ããå§ããŸãããïŒ
let Page = require('../Page'); module.exports = new Page({ template: resource('./list.tmpl'), childClass: { template: resource('./item.tmpl'), binding: { text: 'data:', date: Value.query('data.date').as(format('%D.%M.%Y %H:%I:%S')) } } });
ç§ã¯ããªãã®è£éã§ãã³ãã¬ãŒããæ®ããŸãã
ä»ã®2ããŒãžã®ã³ãŒããåæ§ã§ãã
ããŒãžã«ã¯ãŸã ããŒã¿ãœãŒã¹ããããŸããã åœé¢ã¯ãã®è³ªåã«æ»ããŸãããéããŠããã¿ãã«å¯Ÿå¿ããããŒãžã衚瀺ããæ¹æ³ãèŠãŠã¿ãŸãããã
ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ãã¡ã€ã«ã倿ŽããŸãã
ååããŒãžã®ãµãã©ã€ãã¯ã
pageByName倿°ã®ãããã«åºã¥ããŠçŸåšã®ã«ãŒãã«äžèŽããã³ã³ããŒãã³ãã«
ãªããŸãã æ¬¡ã«ããã®ãµãã©ã€ãã®äœ¿çšããã³ãã¬ãŒãã«è¿œå ããå¿
èŠããããŸãã
<div class="container"> <div b:show="{active}"> <hr/> </div> ... </div>
ããã§ãããŒãžã«ããŒã¿ãœãŒã¹ãããå Žåãã¢ããªã±ãŒã·ã§ã³ã¯åäœãéå§ããŸãã
ããŒã¿ãœãŒã¹
VK APIã®ã©ãããŒã¯äžã«ç€ºãããŠããŸãã ãšãããããã¥ãŒã¹ãå人ãããã³ãªãŒãã£ãªé²é³ã®ãªã¹ããååŸããæ¹æ³ããããŸãã ããŒã¿ãœãŒã¹ãšããŠã
basis.entity-åä»ããšã³ãã£ãã£ã䜿çšããŸãã
ãã¥ãŒã¹ã®ã¿ã€ãã説æããŸãããã
let STATE = require('basis.data').STATE; let entity = require('basis.entity'); let vkApi = require('app.vkApi'); let News = entity.createType('News', { text: String, date: Date }); News.extendReader(data => data.date *= 1000); News.all.setSyncAction(() => vkApi.news().then(News.all.set)); module.exports = News;
åãã¥ãŒã¹ã¯ãããã¹ããšæ¥ä»ã®2ã€ã®ãã£ãŒã«ãã§æ§æãããŠããŸãã
ãªãŒããŒãæ¡åŒµããŠããããšã«æ³šæããŠãã ããã ãã®æ©èœã¯ãããŒã¿ãåã®ã€ã³ã¹ã¿ã³ã¹ã«ãªãåã«ããŒã¿ã倿Žããå¿
èŠãããå Žåã«äœ¿çšãããŸãã
ãŸããåã¿ã€ãã«ã¯
allããããã£ããããŸããããã¯ããã®ã¿ã€ãã®äœæããããã¹ãŠã®ãªããžã§ã¯ãã®ã»ããã§ãã
Newsåã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããšã
News.allã³ã¬ã¯ã·ã§ã³ã«é
眮ãããŸãã
ãã®ã»ããã§ã¯ã
syncActionãå®çŸ©ããŸãã
ã€ãŸã ãåæãå¿
èŠãªå Žåã«åŒã³åºãããã¡ãœããã§ãã
å¿
èŠãªã®ã¯ãVKontakteããããŒã¿ãååŸããŠ
News.all.setïŒïŒã¡ãœããã«æž¡ãã ãã§ããããã«ããã
Newsã¿ã€ãã®æ¢åã®ã€ã³ã¹ã¿ã³ã¹ãæ°ããã€ã³ã¹ã¿ã³ã¹ã«çœ®ãæããããŸãã
ãã®æ¹æ³ã§ã¡ãœããã³ã³ããã¹ããæç€ºçã«èšè¿°ããå¿
èŠããªãããšã«æ³šæããŠãã ããïŒ
News.all.set.bindïŒNews.allïŒ ã
ãã®ã¡ãœããã«ã¯ã䜿ããããããã«
News.allã®ã³ã³ããã¹ããæ¢ã«ãããŸãã
syncActionã§æå®ãããã¡ãœããã
ãããã¹ãè¿ãå Žåããããã¹ã®ç¶æ
ã«å¿ããŠããŒã¿ã»ããã®ç¶æ
ãèªåçã«æ±ºå®ãããããšã«ã泚æããŠãã ããã
News.allã¯ããã¥ãŒã¹ããŒãžã®ããŒã¿ãœãŒã¹ãšããŠè»¢éã§ããããã«ãªããŸããã ãããã£ãŠãããŒãžãã¢ã¯ãã£ãåãããæç¹ã§ã
News.allç¶æ
ã¯
éæšå¥šã«ç§»è¡ããã
syncActionã»ããã«èšè¿°ãããŠããåæããã»ã¹ãéå§ãããŸãã
News.allåæ§ã«ãæ®ãã®2ã€ã®ã¿ã€ãã«ã€ããŠèª¬æããŸãã
åéãšã³ãã£ãã£
let entity = require('basis.entity'); let vkApi = require('app.vkApi'); let Friends = entity.createType('Friends', { photo: String, first_name: String, last_name: String }); Friends.extendReader(data => data.photo = data.photo_100); Friends.all.setSyncAction(() => vkApi.friends().then(Friends.all.set)); module.exports = Friends;
ãªãŒãã£ãªãšã³ãã£ãã£
let entity = require('basis.entity'); let vkApi = require('app.vkApi'); let Audio = entity.createType('Audio', { artist: String, title: String, duration: Date }); Audio.extendReader(data => data.duration *= 1000); Audio.all.setSyncAction(() => vkApi.audio().then(Audio.all.set)); module.exports = Audio;
次ã«ãããŒãžã®ããŒã¿ãœãŒã¹ãšããŠ
News.allãæå®ããŸãã
let Value = require('basis.data').Value; let Page = require('../Page'); let News = require('app.type.news'); let format = require('basis.date').format; let dataSource = News.all; module.exports = new Page({ template: resource('./list.tmpl'), dataSource: dataSource, childClass: { template: resource('./item.tmpl'), binding: { text: 'data:', date: Value.query('data.date').as(format('%D.%M.%Y %H:%I:%S')) } } });
åæ§ã«ã察å¿ããã»ãããä»ã®ããŒãžã«ç€ºããŸãã
åéããŒãž
let Page = require('../Page'); let Friends = require('app.type.friends'); let dataSource = Friends.all; module.exports = new Page({ template: resource('./list.tmpl'), dataSource: dataSource, childClass: { template: resource('./item.tmpl'), binding: { photo: 'data:', first_name: 'data:', last_name: 'data:' } } });
é³å£°ããŒãž
let Value = require('basis.data').Value; let Page = require('../Page'); let Audio = require('app.type.audio'); let format = require('basis.date').format; let dataSource = Audio.all; module.exports = new Page({ template: resource('./list.tmpl'), dataSource: dataSource, childClass: { template: resource('./item.tmpl'), binding: { artist: 'data:', title: 'data:', duration: Value.query('data.duration').as(format('%I:%S')) } } });
ããŒã¯ã¢ããã¯ãããªãã®è£éã§ããŸãã¯èšäºã®æåŸã«ãããªããžããªãžã®ãªã³ã¯ã«ãã£ãŠè¡ãããŸãã
ãã¬ãŒã³ããŒã·ã§ã³ã§ã¯ãããŒã¯ã¢ããã®çš®é¡ã¯ãŸã£ããéèŠã§ã¯ãªããã©ã®ãããªãã®ã§ãããŸããŸããã
ãã¹ãŠæºåãæŽããŸããããããã«æ¹åãå ããŸãããã
ããŒãž404ã远å ããŸãããããè¡ãã«ã¯ãã¡ã€ã³ãã¡ã€ã«ã倿ŽããŸãã
è¡ã£ãã®ã¯ãã«ãŒããããã«æ°ããã«ãŒãã远å ããã«ãŒã倿Žã®è¿œè·¡ã倿Žããããšã ãã§ããã å¿
èŠãªã«ãŒããã«ãŒããããã§èŠã€ãããªãå Žåã¯ã
notFoundã«ãŒãã䜿çšã
ãŸã ã
ãšããã§ãã³ã³ããŒãã³ãã¯requireã§ã¯ãªããªãœãŒã¹ãä»ããŠæ¥ç¶ãããŠããããšã«æ°ã¥ããŸãããïŒ
ãªãœãŒã¹ã䜿çšãããšãé
å»¶ã³ã³ããŒãã³ãã®åæåãå®è£
ã§ããŸããã€ãŸããã³ã³ããŒãã³ãã¯ããã«åæåãããã®ã§ã¯ãªããåããŠå¿
èŠã«ãªã£ããšãã«ã®ã¿åæåãããŸãããªãœãŒã¹ã®è©³çްã«ã€ããŠã¯ãããã¥ã¡ã³ãã®å¯Ÿå¿ããã»ã¯ã·ã§ã³ãåç
§ããŠãã ããããããŠããäžã€ãå®éãVKontakteã®å£ã§ã¯ãããã¹ããã¥ãŒã¹ã ãã§ãªããããã¹ãã®ãªããããª/åçãèŠãããšãã§ããŸãããããã®ã±ãŒã¹ã®åŠçã«ã€ããŠã¯å¥ã®æ©äŒã«æ±ããŸãããä»ã®ãšããã¯ãããã¹ããå«ããã¥ãŒã¹ã®ã¿ã衚瀺ããããã«ãã¥ãŒã¹ããã£ã«ã¿ãªã³ã°ããŠã¿ãŸãããããããè¡ãã«ã¯ããã¥ãŒã¹ã³ã³ããŒãã³ãã倿ŽããŸãã let Page = require('../Page'); let Value = require('basis.data').Value; let News = require('app.type.news'); let format = require('basis.date').format; let Filter = require('basis.data.dataset').Filter; let textOnlyNews = new Filter({ source: News.all, state: Value.query('source.state'), rule: 'data.text', deprecate() { this.source.deprecate(); } }); module.exports = new Page({ template: resource('./list.tmpl'), dataSource: textOnlyNews, childClass: { template: resource('./item.tmpl'), binding: { text: 'data:', date: Value.query('data.date').as(format('%D.%M.%Y %H:%I:%S')) } } });
ãã¥ãŒã¹ããŒãžã®ããŒã¿ãœãŒã¹ããããã¹ãã®ãªããã¹ãŠã®ãã¥ãŒã¹ãç Žæ£ãããã£ã«ã¿ãŒã«çœ®ãæããã ãã§ããããããŠæåŸã«...ããããŒã³ã³ããŒãã³ãã®ã¢ãã¡ãŒã·ã§ã³åïŒ let Node = require('basis.ui').Node; let STATE = require('basis.data').STATE; let DataObject = require('basis.data').Object; let vkApi = require('app.vkApi'); let dataSource = new DataObject({ data: { firstName: '', lastName: '' }, syncAction() { return vkApi.me().then(me => { this.update({ firstName: me.first_name, lastName: me.last_name }); }); } }); module.exports = Node.subclass({ active: basis.PROXY, delegate: dataSource, template: '<h1> {firstName} {lastName}!</h1>', binding: { firstName: 'data:', lastName: 'data:' } });
ãããã£ãŠãããããŒã³ã³ããŒãã³ãã¯ãã¢ã«ãŠã³ãææè
ã®ååãšå§ãåãåã£ãŠè¡šç€ºããããšãåŠç¿ããŸãããçµè«ã¯çµããã§ã¯ãããŸãã
ãã®ãããæ¬æ¥ãbase.jsã§VKontakteçšã®æ¬æ Œçãªã¯ã©ã€ã¢ã³ããäœæããŸãããã¢ããªã±ãŒã·ã§ã³ã¯ãã°ã€ã³ããŠããµãŒããŒãšããŒã¿ãåæã§ããŸããååãšåæ§ã«ãFRPã®éããã©ããäž»ã«ããŒã¿ã®æäœã«éç¹ã眮ããŠãããšããäºå®ã«æ³šæããŠãã ãããã€ãŸããã¢ããªã±ãŒã·ã§ã³ãã¿ã¹ã¯ãå®è¡ããããã«ããŒã¿ãããŒãæ§ç¯ããŸããåæã«ãbasis.jsã®ä»æ§ã¯ãã«ãŒãããªãã倿°ã®ãã©ã³ãããããããã¯ã©ã€ã¢ã³ãã³ãŒãã¯ããªãç·åœ¢ã«ãªããŸããå°ãªããšã瀺ãããã¿ã¹ã¯ã¯ããããªãã§è§£æ±ºã§ããŸããæ¬¡ã®èšäºã§ã¯ãã¯ã©ã€ã¢ã³ããæ¹åãããã®æ©èœãåäžãããŸããbase.jsã«é¢å¿ããå¯ãããã ãããããšãããããŸãïŒè²Žéãªã¢ããã€ã¹ã
ããã ããlahmatiyã«æè¬ããŸã;ïŒ
䟿å©ãªãªã³ã¯ïŒ