jRIAppã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®éçºçšã«äœæããããã1ã€ã®HTML5ãã¬ãŒã ã¯ãŒã¯ã§ããããã®æ©èœã¯ãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãããå£ã£ãŠããŸããã
angularJSãemberJSãªã©ã®æ¢åã®ãã¬ãŒã ã¯ãŒã¯ãšã®äž»ãªéãã¯ããã¬ãŒã ã¯ãŒã¯ã«çµ±åãããããŒã¿ãµãŒãã¹ã®å¯çšæ§ãšããã®ã¿ã€ãã®ãã¬ãŒã ã¯ãŒã¯ã§æãäžè¬çãªMVCèšèšã§ã¯ãªãMVVMèšèšã¢ãŒããã¯ãã£ã®äœ¿çšã§ãã
äžè¬çã«ã¯ãããŒã¿ãã€ã³ãã£ã³ã°ãå®è£
ããHTMLèŠçŽ ã«å®£èšçã«ããžãã¯ãã¢ã¿ããããããã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãæã¡ãããŒã¿ïŒDbContextãDbSetïŒãæäœããããã®ã¯ã©ã¹ãæã¡ããµãŒããŒåŽã®ããŒã¿ãµãŒãã¹ãå®è£
ãããŠããHTML5ãã¬ãŒã ã¯ãŒã¯ãšããŠèª¬æã§ããŸãã
ãã¬ãŒã ã¯ãŒã¯ã®ã¯ã©ã€ã¢ã³ãéšåã¯javascriptã§èšè¿°ããïŒ
typescriptããŒãžã§ã³ã¯çŸåšéçºäžã§ã ïŒããµãŒããŒéšåã¯CïŒã§èšè¿°ãããŠããŸãã
ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ãMITã©ã€ã»ã³ã¹ã®äžã§
GitHubã«å
¬éãã
ãŠããŸã ã ASP.NET MVC4ã䜿çšããŠèšè¿°ããããã¢ã¢ããªã±ãŒã·ã§ã³ãšãã®äœ¿çšã«é¢ããããã¥ã¡ã³ããå«ãŸããŠããŸãã
jRIAppã䜿çšããŠäœæãããã¢ããªã±ãŒã·ã§ã³ã®ã¹ã¿ã€ã«ã¯ãWCF RIAãµãŒãã¹ã§Microsoft Silverlightã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãäœæããããšã«éåžžã«äŒŒãŠããŸãã ããŒã¿ãã€ã³ãã£ã³ã°ã«ãåæ§ã®æ§æããããŸã-åæ¹åãåæ¹åãããŒã¿ã³ã³ããŒã¿ãŒã䜿çšã§ããŸãã ã¢ã¯ã·ã§ã³ã¯ãã³ãã³ããä»ããŠãã¿ã³ããã€ããŒãªã³ã¯ãªã©ã®ã³ãã³ãèŠçŽ ã«ãªã³ã¯ã§ããŸãã
ããšãã°ãããã¯ãã¢ã¢ããªã±ãŒã·ã§ã³ã§ããŒãžã¹ã€ãããäœæããæ¹æ³ã§ãã
<div style="margin-top:40px;text-align:left; border:none;width:100%;height:15%"> <div style="float:left;" data-bind="{this.dataSource,to=dbSet,source=VM.productVM}" data-view="name=pager,options={sliderSize:20,hideOnSinglePage=false}"> </div> <div style="float:left; padding-left:10px;padding-top:10px;"> <span>Total:</span> <span data-bind="{this.value,to=totalCount,source=VM.productVM.dbSet}"></span>, <span>Selected:</span> <span data-bind="{this.value,to=selectedCount,source=VM.productVM}"></span> </div> <button style="float:right;" data-bind="{this.command,to=addNewCommand,mode=OneWay,source=VM.productVM}"> + New Product </button> </div>
ãã³ãã¬ãŒãã«ãåæ§ã®ã¿ã€ãã®äœæããããŸã-foreachã«ãŒãã«äŒŒãã¹ã¯ãªããã®äœ¿çšãé€å€ããŸããããã¯ãçµæã®HTMLããã¥ã¡ã³ãã§ããŒã¯ã¢ããã®æçã®åºåãç¹°ãè¿ããŸãã ãã³ãã¬ãŒãã®ãã®æ©èœã¯ãèŠçŽ ãã¥ãŒã䜿çšããŠãã€ã³ãã£ã³ã°ãäœæãããšãã«ããŒã¿ãã€ã³ãã£ã³ã°ãå®éã«ã©ãããããããããã£ã®åDOMèŠçŽ ã«å®å
šã«çœ®ãæããããŸããããã«ãããæ¬è³ªçã«ããžãã¯ãHTMLèŠçŽ ã«ãã€ã³ãã§ããŸãã ãããã£ãŠãjQueryãã©ã°ã€ã³ã¯ããžãã¯ãHTMLèŠçŽ ã«ãã€ã³ãããŸããããã¬ãŒã ã¯ãŒã¯ã¯ããã宣èšã¹ã¿ã€ã«ã§è¡ããŸãã
å°ããªãã³ãã¬ãŒãã®äŸïŒ
<div id="stackPanelItemTemplate" data-role="template" class="stackPanelItem" > <fieldset> <legend><span data-bind="{this.value,to=radioValue}"></span></legend> Time: <span data-bind="{this.value,to=time,converter=dateTimeConverter,converterParam='HH:mm:ss'}"></span> </fieldset> </div>
ããã«ãDataGridãDataFormãStackPanelãComboBoxãªã©ãããŒã¿ãæäœããããã®ã³ã³ããŒãã³ããšçµ±åãããæ¢è£œã®ãŠãŒã¶ãŒèŠçŽ ããããŸããããŒã¿æ€èšŒã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã§è¡ããããµãŒããŒåŽã§èšå®ãããã¡ã¿ããŒã¿ã䜿çšããŸãã
ããã«ããã¬ãŒã ã¯ãŒã¯ãéå§ããããã«ããã®ãããã¯ã«ããã€ãã®åºæ¬äºé
ãå«ããããšæããŸãã
ãã¬ãŒã ã¯ãŒã¯ã®åºæ¬ã¯ã©ã¹ïŒ
ãªã圌ã¯ãããªã«æ³šç®ã«å€ããã®ã§ããïŒ
ãŸãããªãã¶ãŒããŒæ©èœãã€ãŸã ãµãã¹ã¯ã©ã€ããŒãéç¥ãåãåãããã€ãã³ããæ·»ä»ã§ããŸãã ãŸãããªããžã§ã¯ããå æãããªãœãŒã¹ã解æŸããããã«ãªããžã§ã¯ããç Žæ£ããåºæ¬æ©èœïŒ
äž»ã«ä»ã®ãªããžã§ã¯ããšã€ãã³ããžã®ãªã³ã¯ ïŒãåããŠãããã€ãã³ãã®å©ããåããŠä»ã®ãªããžã§ã¯ãã«ç Žå£ãéç¥ããããšãã§ããŸãããŸãããã®ãªããžã§ã¯ãïŒ
éåžžãã¯ã©ã€ã¢ã³ãã¯ã°ããŒãã«ãªããžã§ã¯ããšã¢ããªã±ãŒã·ã§ã³ãªããžã§ã¯ãã®ãšã©ãŒã€ãã³ãã®ã¿ããµãã¹ã¯ã©ã€ãããŸã ïŒã
ãã®ã¯ã©ã¹ã«åºæã®ãã1ã€ã®éèŠãªæ©èœã¯ãã¡ãœãã
extendãæã£ãŠããããšã§ããããã«ããã掟çã¯ã©ã¹ã®æ©èœãç¶æ¿ã§ããŸãã
æ°ãããªããžã§ã¯ãã¯ã©ã¹ãäœæããäŸïŒ
var NewObject = RIAPP.BaseObject.extend( {
ããã«ããªããžã§ã¯ãã¯ã©ã¹ã¯ä»ã®ã¢ãžã¥ãŒã«ããååŸã§ããŸãã
var Instance = app.getType('custom.NewObject').create('radioValue1');
ãã¹ãŠã®ãªããžã§ã¯ãã¯ã©ã¹ã¯ã¢ãžã¥ãŒã«å
ã§äœæããããããã¢ãžã¥ãŒã«ã®åŸæ¥ã®å®çŸ©ã§è¡ãããŠããããã«ããªããžã§ã¯ãã¯ã©ã¹ãããããããšã¯ã¹ããŒãã§ããŸãã åã¢ãžã¥ãŒã«å
ã§ã
thiså€æ°ã¯ã¢ãžã¥ãŒã«èªäœãåç
§ããä»»æã®ããããã£ãããã«è¿œå ã§ããŸãã
ããšãã°ãã¢ãžã¥ãŒã«ã®1ã€ã§ããnewObjModã§ã¯ãã¯ã©ã¹ããšã¯ã¹ããŒãããŸãã
var thisModule = this; thisModule.NewObject = NewObject;
ãããŠå¥ã®ã€ã³ããŒãïŒ
var NewObject = app.modules.newObjMod.NewObject;
ãã¬ãŒã ã¯ãŒã¯ã§ã®ã¯ã©ã¹ã®å®çŸ©ã®åºç€ãç 究ããããããŒã¿ãã€ã³ãã£ã³ã°ã®å®çŸ©ã«é²ãããšãã§ããŸãã ãªããžã§ã¯ã
Bindingã« ã
ããŒã¿ãã€ã³ãã£ã³ã°ïŒ
ååãšããŠããªããžã§ã¯ãBindingã¯ã³ãŒãã§äœæã§ããŸããããã䟿å©ãªã®ã¯ãããŒã¿ãã€ã³ãã£ã³ã°ã®å®£èšçãªå®çŸ©ã§ãããäž»ã«ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŸãïŒ
ããã¥ã¡ã³ãã«ã¯ã³ãŒãã§ãã€ã³ãã£ã³ã°ãäœæããäŸããããŸã ïŒã
HTMLèŠçŽ ãžã®ããŒã¿ãã€ã³ãã£ã³ã°ã®äŸã
select ïŒ
<select size="1" style="width:220px" data-bind="{this.dataSource,to=mailDocsVM.dbSet,mode=OneWay,source=VM.sendListVM} {this.selectedValue,to=selectedDocID,mode=TwoWay,source=VM.sendListVM} {this.toolTip,to=currentItem.DESCRIPTION,mode=OneWay,source=VM.sendListVM.mailDocsVM}" data-view="options:{valuePath=MailDocID,textPath=NAME}">
å±æ§data-bindã¯ãããŒã¿ãã€ã³ãã£ã³ã°åŒãå®çŸ©ããŸãã ååŒã¯äžæ¬åŒ§ã§å²ãŸããã¬ã·ãŒããŒã®ããããã£ãžã®ãã¹ãšããŒã¿ãœãŒã¹ã®ããããã£ãžã®ãã¹ãå®çŸ©ããŸãã åŒã«ã¯ãã¢ãŒããæå®ã§ããŸã-modeãã€ãŸã ããŒã¿ã移åããæ¹åïŒOneTimeïŒãœãŒã¹ããã¬ã·ãŒããŒãžïŒãOneWayïŒãœãŒã¹ããã¬ã·ãŒããŒïŒãTwoWayïŒäž¡æ¹åïŒã ã¢ãŒããOneWay-ããã¯ããã©ã«ãã®ã¢ãŒãã§ãããçç¥ã§ããŸãã ããããã£ãã¹ãšãã€ã³ãã£ã³ã°ã¢ãŒãã«å ããŠã
sourceãæå®ã§ããŸãã ãã®ãã€ã³ãã£ã³ã°ããããã£ã¯ãªãã·ã§ã³ã§ããæå®ããªãå ŽåããœãŒã¹ããããã£ã®ãã¹ã¯ããŒã¿ã³ã³ããã¹ãããèšç®ãããããã§ãã æå®ãããšããã¹å
šäœãã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ããèšç®ãããŸãã éåžžãã«ã¹ã¿ã ãã¥ãŒã¢ãã«ã¯VMããããã£ã«ã¢ã¿ããããŸãïŒ
ããã¯Applicationãªããžã§ã¯ãã«ã¢ã¿ãããããããŒã ã¹ããŒã¹ã§ãïŒã ãããã£ãŠã
source = VM.sendListVMã¯ã[Application Object] .VM.sendListVMã®ç¥ã§ãã
ã«ã¹ã¿ã ãã¥ãŒã¢ãã«ã®åæåïŒäœæïŒã®äŸïŒ
ãã€ã³ãã£ã³ã°åŒã§
sourceãæå®ããªãã£ãå Žåã
ãœãŒã¹ã®pathããããã£ã¯ãã®åŒãæå®ãããå Žæãã決å®ãããŸãã åçŽã«HTMLããŒãžã®å Žåããã¹å
šäœãApplicationãªããžã§ã¯ãããèšç®ãããŸãã
ãã ããåŒããã³ãã¬ãŒãïŒ
Data Template ïŒãŸãã¯ããŒã¿ãã©ãŒã ïŒ
DataForm ïŒå
ã§äœ¿çšãããå ŽåããœãŒã¹ïŒ
åŒã§æ瀺çã«æå®ãããŠããªãéã ïŒã¯ããã³ãã¬ãŒããŸãã¯ãã©ãŒã ã®
ããŒã¿ã³ã³ããã¹ã ïŒ
data context ïŒãã決å®ãã
ãŸã ã
ãŸããããŒã¿ãã€ã³ãã£ã³ã°ã«ã¯ãããŒã¿ã³ã³ããŒã¿ãŒãšã³ã³ããŒã¿ãŒã®ãã©ã¡ãŒã¿ãŒãå«ããããšãã§ããŸããããã«ããããœãŒã¹ããã¬ã·ãŒããŒã«ããŒã¿ãæž¡ããšãã«ããŒã¿ãå€æŽã§ããŸãã ããšãã°ãæ°å€ãšæ¥ä»ã®æžåŒèšå®ã«äŸ¿å©ã§ãã
ãã€ã³ãã£ã³ã°ã©ã€ããµã€ã¯ã«ïŒ
åäžããŒãžã¢ããªã±ãŒã·ã§ã³ãäœæããå Žåãã¢ããªã±ãŒã·ã§ã³ãç¶ç¶ããŠäœ¿çšããŠãã¡ã¢ãªãªãŒã¯ãçºçããªãããã«ããå¿
èŠããããŸãã
ãããã£ãŠããã¬ãŒã ã¯ãŒã¯ã«ã¯ãªããžã§ã¯ããäœæããããã®ã·ã¹ãã ããããäžèŠãªãªããžã§ã¯ãããã¡ã¢ãªãæ¶å»ããŸãïŒ
ã€ãŸããæªäœ¿çšã®ãªããžã§ã¯ããžã®ãªã³ã¯ãåé€ãããŸã ïŒã
çåœã®ã«ãŒãïŒ
ã€ãŸãããªã³ã¯ãä¿åããã«ãŒããªããžã§ã¯ã ïŒã¯ãã°ããŒãã«ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã§ãããjriapp.jsãããŒãããããšããã®ã·ã³ã°ã«ïŒ
ã·ã³ã°ã«ãã³ ïŒã€ã³ã¹ã¿ã³ã¹ãèªåçã«äœæãããŸãã ãã®ãªããžã§ã¯ãã¯ããŠãŒã¶ãŒãäœæããApplicationãªããžã§ã¯ããžã®ãªã³ã¯ãHTMLããŒãžã«ä¿åããŸãïŒ
éåžžã¯1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããWebããŒãã§äœæããå Žåã¯è€æ°äœæã§ããŸã ïŒã ã¢ããªã±ãŒã·ã§ã³ãªããžã§ã¯ãã¯ãäœæããããªããžã§ã¯ããžã®ãªã³ã¯ãªã©ãæ ŒçŽããŸãã
ïŒ
destroyã¡ãœãããåŒã³åºãããšã«ããïŒãªããžã§ã¯ããç Žæ£ããã
ãšããã®ãªããžã§ã¯ããžã®åç
§ãåé€ãããŸãã ãããæ
åœããã®ã¯ããããäœæãããªããžã§ã¯ãã§ãã
ãã¬ãŒã ã¯ãŒã¯ã¯ããŒã¿ãã€ã³ãã£ã³ã°ã«åºã¥ããŠãããèŠçŽ ãã¥ãŒã¯èŠçŽ ãã¥ãŒïŒ
jQueryãã©ã°ã€ã³ã«äŒŒããDOMèŠçŽ ã«æ¥ç¶ãããããžãã¯ãæã€
ã©ãã㌠ïŒã§ãã ã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ããµã€ã¯ã«äžã«å€§éã«äœæããã³åé€ãããŸãã
ãã€ã³ãã£ã³ã°ãªããžã§ã¯ããäœæãããšãããã¬ãŒã ã¯ãŒã¯ã¯ãŸãHTML DOMèŠçŽ ã«é¢é£ããèŠçŽ ã¿ã€ãããããã©ãããå€æããŸãã ããšãã°ããã¬ãŒã ã¯ãŒã¯ã«ã¯ãDOMèŠçŽ ã®ãã¬ãŒã ã¯ãŒã¯ã«çµã¿èŸŒãŸããèŠçŽ ãã¥ãŒã¯ã©ã¹ãå®çŸ©ããã¢ãžã¥ãŒã«ããããŸãïŒ
ãŠãŒã¶ãŒã¯ã¢ãžã¥ãŒã«ã«ã«ã¹ã¿ã èŠçŽ ãã¥ãŒãªããžã§ã¯ããè¿œå ã§ããŸã ïŒã ãããã®ããã€ãã¯ãèŠçŽ ã¿ã°ã®ååã«ãã£ãŠèŠçŽ ã«é¢é£ä»ããããŠããŸãã ããšãã°ãå
¥åèŠçŽ ã®äž»èŠãªã¿ã€ãã«ã¯ã察å¿ããèŠçŽ ãã¥ãŒã¿ã€ãããããŸãã ãã ããäžéšã®èŠçŽ ãã¥ãŒã¯ç¬èªã®ååã§ç»é²ãããŠããŸãïŒ
ã€ãŸããç¹å®ã®ã¿ã°ã«é¢é£ä»ããããŠããŸãã ïŒã ããšãã°ãååtabsã®äžã«ç»é²ãããTabsElViewãååbusy_indicatorã®äžã«ããBusyElViewã å®éã«ã¯ãããã¯ããã€ã³ãã£ã³ã°ãäœæããèŠçŽ ãã¥ãŒã®ã¿ã€ããéžæïŒ
å€æŽ ïŒããããã«ãããŒã¿ãã¥ãŒå±æ§ã䜿çšã§ããããšãæå³ããŸãã
次ã®äŸã§ã¯ãååãšãã¹ãã³ããŒã®äžã«ç»é²ãããèŠçŽ ãã¥ãŒããã€ã³ãã£ã³ã°ã§äœæããããšã瀺ããŠããŸãã
<span data-bind="{this.command,to=expanderCommand,mode=OneWay,source=VM.headerVM}" data-view="name=expander"></span>
ãŸããèŠçŽ ãã¥ãŒã®å Žåããªãã·ã§ã³ãæž¡ããŠäœæããå¿
èŠãããå ŽåããããŸãïŒ
èŠçŽ ãã¥ãŒã¯ãã³ã³ã¹ãã©ã¯ã¿ã§ãªãã·ã§ã³ã
åãåããŸã ïŒã
<input type="text" data-bind="{this.value,to=testProperty,mode=TwoWay,source=VM.testObject1}" data-view="options:{updateOnKeyUp=true}" />
ã¢ãžã¥ã©ãŒæ§é ïŒ
ãã¬ãŒã ã¯ãŒã¯ã«ã¯ã¢ãžã¥ãŒã«ã®éå±€ããããŸãã
ã°ããŒãã«ãªããžã§ã¯ãã«ã¯ãæäžäœã®ã¢ãžã¥ãŒã«æ§é ããããŸãã ã¢ãžã¥ãŒã«ã®1ã€ã¯Applicationã¯ã©ã¹ãå®çŸ©ããŸãã
åæ§ã«ãApplicationãªããžã§ã¯ãã«ã¯ç¬èªã®ã¢ãžã¥ãŒã«ïŒ
ã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯ã¢ãžã¥ãŒã« ïŒããããŸãã
ã¢ããªã±ãŒã·ã§ã³ïŒ
Application ïŒã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããšãããã®ã¢ãžã¥ãŒã«ãåæåããŸããã¢ãžã¥ãŒã«ã¯ãããŒïŒ
ãã¬ãŒã ã¯ãŒã¯ã§å®çŸ©ãããŠãã ïŒãšãŠãŒã¶ãŒïŒ
ãŠãŒã¶ãŒã«ãã£ãŠå®çŸ©ãããŠãã ïŒã«åå²ãããŸãã
ã«ã¹ã¿ã ã¢ãžã¥ãŒã«ã¯ããã¬ãŒã ã¯ãŒã¯ã®æ©èœã®æ¡åŒµãæäŸãããããã®ãã¥ãŒã¢ãã«ã¯ã©ã¹ã®å®çŸ©ãäœæãã圹å²ãæãããŸãããŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ã§ã¯ãMVVMã¯ããã€ã³ãã£ã³ã°ïŒ
DataBindings ïŒã®ããŒã¿ãœãŒã¹ãæäŸããŸãã
èŠçŽïŒ
ããã¯ãã¢ããªã±ãŒã·ã§ã³ãäœæããããã®ãã¬ãŒã ã¯ãŒã¯ã§å©çšå¯èœãªãã¹ãŠã®ã»ãã®äžéšã«éããªããšæããŸãã ããã¥ã¡ã³ãã¯80ããŒãžã«ãªãããã¹ãŠã®æ©èœãçã玹ä»ãããã¯ã§èª¬æããããšã¯ã§ããŸããã ãã詳现ãªç¥èãåŸãã«ã¯ããã¬ãŒã ã¯ãŒã¯ã®äœ¿çšã®åã
ã®éšåãã«ããŒãããã®ãããªå°ããªãããã¯ãããã€ãæžãå¿
èŠããããŸãã ãããããŸã第äžã«ãGitHubã§ãããžã§ã¯ããèŠãŠãyoutubeã§ãããªãã¢ã¢ããªã±ãŒã·ã§ã³ãèŠãŠãã ããã
ãŸãããã®ãã¬ãŒã ã¯ãŒã¯ã¯SilverLightã§å®è¡ãããŠããã¢ããªã±ãŒã·ã§ã³ã翻蚳ããããã«ç§ãäœæãããã®ã§ããããããã¯ããŒã¿ã¢ããªã±ãŒã·ã§ã³ã§ããããšã«æ³šæããŠãã ããã ãããã£ãŠããã¢ã¢ããªã±ãŒã·ã§ã³ã®èšèšã¯ã·ã³ãã«ã§ãäž»ã«ããŒã¿ã®æäœæ¹æ³ã瀺ããŠããŸãã ãã ããé©åãªãã¶ã€ã³ãå¿
èŠãªå Žåããã®ãã¬ãŒã ã¯ãŒã¯ã¯ã¹ã¿ã€ã«ãšãã¶ã€ã³ã®äœ¿çšã«é¢ããŠäœãå¶éããŸããã ãã¶ã€ã³ã¯ãã¶ã€ããŒã«ã®ã¿äŸåããŸãã