
ãã®çµæãããã³ããšã³ããã³ããŒãé¢å¿ãæã€å¯èœæ§ã®ããææ³ã圢æãããŸããã ãã®èšäºã§ã¯ããã®ææ³ã説æããããšæããŸãã
ããã¯ã¢ãŠããã€ã³ããŒãä»ããŠhtmlããŒãžã«åã蟌ãŸããŠããã·ã¹ãã ã«ã€ããŠèª¬æããŸãã ã³ãŒãã¯ãããã¯ã¢ãŠããã€ã³ãã£ã³ã°ãæã€htmlãã³ãã¬ãŒãã§æ§æããããã©ã°ã€ã³ãŠã£ãžã§ããã«ååšããŸãã ãŠã£ãžã§ããã¯çžäºã«ãã¹ãã§ããŸãã ããã¯ãã¹ãŠrequire.jsã䜿çšãã amd圢åŒã§å®è¡ãããŸãã å€éšããŒãžãžã®äŸåã¯æå°éã«æãããããã¹ãŠã®ã©ã€ãã©ãªïŒjqueryãknockoutãããã³ãã©ã°ã€ã³ïŒã¯ãåå空éãæã€ããŒã«ã«ã¹ããŒã¹ã§ç¬èªã®ã©ã€ãã©ãªã®ã¿ã䜿çšããŸãã ã³ãŒãããã«ãããã«ã¯ã r.jsã䜿çšãããŸãã ãŸããããŒãã¹ãã©ããã®å¯Ÿè©±ã«åºã¥ããŠãã¯ãŒã«ãªåèŸåãšããŠæ¬æ ŒçãªãŠã£ã³ããŠãããŒãžã£ãŒãäœæããŸãã
ãã¢ãšãœãŒã¹
ç§ã®æåã®ããã¯ã¢ãŠãèšäº-http://habrahabr.ru/post/154003/ãã芧ã«ãªãããšããå§ãããŸãã ããã§å§ããã¢ã€ãã¢ãéçºããŸãã
ãããã¯ãŒã¯ã®ããã³ããšã³ãã®ãããã¿ã€ãã¯ã httpsïŒ//github.com/Kasheftin/uncrdã«ãããŸã ã
ããããã¹ãŠã©ã®ããã«èŠããããããã§èŠãããšãã§ããŸã-http ://www.photovision.ru ã æå³çã«ããçŽãããŠããªãåçã®ãããµã€ãããããŸãã 1ã€ã®ã¹ã¯ãªããã¯ããããã¯ãŒã¯æ©èœãæäŸããuncrd.comãã¡ã€ã³ããæ¥ç¶ãããŠããŸãã åçãã¯ãªãã¯ãããšãåçãã¥ãŒã¢ãŒã®ãŠã£ã³ããŠããããã¢ããããŸããäœæè ã®ãããã¡ã€ã«ã«ç§»åããŠãåçãã³ã¡ã³ããç»é²ãæçš¿ã§ããŸãã ç§ã®ç®æšã¯ãæäœéã®æ©èœãåããæšæºçãªãããã¯ãŒã¯ãäœæããããšã§ããã
ãªããžããªã«ã¯ããããã¯ãŒã¯ã®æäœã«é¢ããããã¥ã¡ã³ããå«ãŸããŠããŸããã»ãšãã©ã®ãããã¯ããªã¹ãããããã®ãã©ã¡ãŒã¿ãŒã説æãããŠããŸã-http://uncrd.com/docs/1.html
ããã³ããšã³ãã¯ããŠãããŒãµã«ã³ã¢ãšãããã¯ãŒã¯åºæã®ãŠã£ãžã§ããã§æ§æãããŠããããšã«æ³šæããŠãã ããã äœæè ã®åçãšãããã£ãŒã«ã®è¡šç€ºã¯2çªç®ã«ããŠã£ã³ããŠãããŒãžã£ãŒãšãŠã£ãžã§ããæ¥ç¶ã¡ã«ããºã ã¯1çªç®ã«å±ããŸãã åºç€ãæ€èšããŸãããäžåºŠã«éçºãããããïŒã·ã¹ãã ã®ç¹å®ã®å Žæã«ããã¹ãã§ãããèš±å¯ã¯ã«ãŒãã«å ã«ããããïŒãã·ã¹ãã ã³ãŒãããã¯ããŸãåé¢ãããŠããŸãããã³ã¢ã§ãããããã€ãã®ãã¢ãŠã£ãžã§ããã詳现ã«åæããŸãã
çæãšCSS
ãœãŒã·ã£ã«ãããã¯ãŒã¯ã®ã¢ãžã¥ãŒã«ãå€éšãµã€ãã«æ¥ç¶ãããŠããå Žåã®æšæºããžãã¯ã¯ãiframeã®äœ¿çšã§ãã å€éšãµã€ãã¯ã»ãã·ã§ã³ããã©ãã°ã¢ãŠãããªããããããã¯å®å šã§ããå€éšãµã€ãã®cssã¯iframeå ã®ã¹ã¿ã€ã«ã«åœ±é¿ããªããããcssã¯æ£ããã§ãã ãã®ããžãã¯ã¯ããã§ã¯å£ããŠããŸãã ãããã¯ãŒã¯ã³ãŒãã¯ãµã€ãããŒãžã«çŽæ¥åã蟌ãŸããŠãããããäºåå®çŸ©ãããæ£æ¹åœ¢ã®ãããã¯ãæ¿å ¥ããã ãã§ãªããããå€ãã®æ©èœãå©çšã§ããŸãã ã»ãã¥ãªãã£ã¯ããããã¯ãŒã¯äžã®ãµã€ããšããŒã¯ã³ãç»é²ããããšã«ãã£ãŠå€§éšåã決å®ãããŸãã ããããCSSã¯è§£æ±ºãããŠããŸããã ä»»æã®cssã«ãŒã«ã䜿çšããŠããŒãžã«èŠçŽ ãæ¿å ¥ããæ¹æ³ãããããããã¹ãŠãå£ãããšãªããå€èŠ³ã100ïŒ ç¥ã£ãŠããïŒåã¿ã°ã®ãã¹ãŠã®cssããããã£ããªã¹ãããå Žåãé€ãïŒã ãããã£ãŠããããã¿ã€ãã§ã¯ããµã€ããããŒãã¹ãã©ããã§å®è¡ãããŠãããšæ³å®ããŠããŸãïŒãããã¯ãŒã¯ã¯ãããŒãã¹ãã©ããã§cssããã©ãã°ããŸãããããã«ãããå ã®ãµã€ãã®èšèšã厩ããå¯èœæ§ããããŸãïŒã
ã·ã¹ãã ã³ã¢
ããã³ããšã³ãã¯ãã·ã¹ãã ã®ã³ã¢ãšåçã«ããŒãããããŠã£ãžã§ããã§æ§æãããŸãã åãŠã£ãžã§ããã¯ãamdãã©ãŒã ïŒäŸmessageForm.js ïŒã®åå¥ã®ãã¡ã€ã«ã«ããjsãªããžã§ã¯ããšãã³ãŒãä»ãã®HTMLãã³ãã¬ãŒãïŒäŸmessageForm.html ïŒã§æ§æãããŠããŸãã æè¿ãknockout.jsã§ã¢ãžã¥ã©ãŒã¢ãããŒãã䜿çšããããã€ãã®ã¢ããªã±ãŒã·ã§ã³ãèŠãŠããŸãããããã¹ãŠãã®çš®é¡ã®ãã€ã³ãã£ã³ã°ã䜿çšããŠããŸããã
ko.bindingHandlers.widget = { update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { var widget = ko.utils.unwrapObservable(valueAccessor().data); require([widget.templateName],function(html) { ko.renderTemplate(element,bindingContext.extend({$data:widget}),{html:html},element); if (widget.domInit) widget.domInit(elem,valueAccessor()); }); return { controlsDescendantBindings: true}; }
次ã«ãcore.jsãŸãã¯ä»»æã®ãŠã£ãžã§ããïŒçžäºã®æ·»ä»ãã¡ã€ã«ããµããŒãããŠããããïŒã§ãå¿ èŠãªãŠã£ãžã§ããã®ãªããžã§ã¯ããäœæãããŸããthis.w = SomeWidgetïŒïŒ; ããã³<ïŒ-koãŠã£ãžã§ããïŒ{dataïŒw}-> <ïŒ-/ ko->ã¯ããã³ãã¬ãŒãã®é©åãªå Žæã§åŒã³åºãããŸãã ããã¯ã¢ãŠãã¯ãã€ãã£ãã§ãååä»ããããã³ãå éšã®ååã®ãªãããã³ãã¬ãŒãã®ã¿ããµããŒãããããããã®å Žåã®renderTemplateã¡ãœããã¯ãã®èšäºã® stringTemplateEngineã䜿çšããŸã ã
ãã®ã¢ãããŒãã®å©ç¹ã¯ã·ã³ãã«ã§ãã ãŠã£ãžã§ãããæ瀺çã«äœæãããšã圌ãã©ãã«äœãã§ããã®ãããããããã€ã³ããããšãæ°ããäœæããããªããžã§ã¯ãã®ã³ã³ããã¹ãã§ãã³ãã¬ãŒããæãã«ã¬ã³ããªã³ã°ãããŸãã ãã ããuncrdã§ã¯ãããã°ã©ãã³ã°ãªãã§htmlãããŠã£ãžã§ãããäœæã§ããããšãå¿ èŠã§ãã ããšãã°ã次ã®ã³ãŒããæ©èœããå¿ èŠããããŸãã
... ... <!-- uncrd if: user --> , <!-- uncrd text: user.name --><!-- /uncrd --> <!-- uncrd widget: 'userMenu' --><!-- /uncrd --> <!-- /uncrd --> <!-- uncrd ifnot: user --> <!-- uncrd widget: 'loginForm' --><!-- /uncrd --> <!-- /uncrd --> ... ...
ã€ãŸãããŠã£ãžã§ããã¯ãŠã£ãžã§ãããã€ã³ããŒå ã§äœæããå¿ èŠããããŸãã åæã«ãäœæããããªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ã«åé¡ããããŸããã¢ãã«ã³ãŒãå ã§ã¯ãå éšãµããŠã£ãžã§ãããªããžã§ã¯ãããã€ããŒãããã³äœæãããã©ãã«ååšãããã¯ããããŸããã ãããã£ãŠãwidget-bindingå ã§ãŠã£ãžã§ãããäœæãããšãã¯ãäœæãããªããžã§ã¯ããchildrenWidgetså€æ°å ã®ãã®èŠªã«ç»é²ããå¿ èŠããããŸãããŠã£ãžã§ãããåé€ããå Žåã¯ããµãããªãŒå šäœãååž°çã«åé€ããŸãã ããã¯ãçµæã®ãã€ã³ãã£ã³ã°widgetBinding.jsã®ããªãèšå€§ãªã³ãŒãã«ãããã®ã§ã ã
ãŠã£ã³ããŠãããŒãžã£ãŒ
ããŒãã¹ãã©ãããããã¢ãããã€ã¢ãã°ãã©ã®ããã«èŠãããã倧奜ãã§ãã ç§ããã®ãŠã£ã³ããŠjqueryãã©ã°ã€ã³ã䜿çšããããšããŸããããè€æ°ã®ãŠã£ã³ããŠãšééã£ãã¹ã¯ããŒã«ãäœæãããšãã«ãã§ãŒãã®ã°ãªãããé²æ¢ãããŸããã åãã€ããŠããŸãã äž»ãªé害ã¯ãããã¯ã¢ãŠãã®ãã¹ãŠã®åãæå ã«ãããšããèªèã§ããã圌ã¯jqueryãšDOMã§å¿ããã£ãã ããã¯ã¢ãŠããããå ŽåãDOMæäœãå«ãã§ãã uncrdã§ã¯ãDOMã䜿çšããæäœã¯ãç¹å¥ã«å²ãåœãŠãããdomInitã¡ãœããã®2ã€ã®å Žåã«ã®ã¿èŠãããŸãã ãããã£ãŠããŠã£ã³ããŠãããŒãžã£ãŒwindowManager.jsã¯ãè€æ°ã®éããŠãããŠã£ã³ããŠãšãã©ãã°ã¢ã³ãããããããµããŒãããããŒãã¹ãã©ããã¹ã¿ã€ã«ã§èšè¿°ããããã¹ãŠã®ãŠã£ã³ããŠãã©ã¡ãŒã¿ãŒã¯ç£èŠå¯èœãªå€æ°ã§ãã
ããã§ã1ã€ã®ãšã¬ã¬ã³ããªããªãã¯ã«ã€ããŠèª¬æããŸãã windowManagerã«ã¯ããŠã£ãžã§ãããå«ããŠã£ã³ããŠãéãããã®openã¡ãœããããããŸãã éããããŠã£ã³ããŠèªäœããŠã£ãžã§ããã§ããããã芪ã®windowWidgetã§ããchildrenWidgetsé åã«èªèº«ãç»é²ããŸãã windowManagerãåæåãããšãã«ãthis.childrenWidgets = ko.observableArrayïŒ[]ïŒãæ瀺çã«èšå®ããããããŠã£ãžã§ãããã€ã³ãã£ã³ã°ã®éåžžã®é åã«ãã£ãŠãªãŒããŒã©ã€ããããŸããã ããã§ã®nakoutã®äŸ¿å©ãã¯ãobservableArrayãéåžžã®é åãšåãpushãpopãspliceã¡ãœãããæã£ãŠããããšã§ãã ãããã£ãŠããŠã£ãžã§ããå ã§ã¯ããã€ã³ãã£ã³ã°ã¯éèŠã§ã¯ãªããéåžžã¯é åãŸãã¯ç£èŠå¯èœã§ãã éãããåãŠã£ã³ããŠã¯ãobservableArrayã«ç»é²ãããŸãã ããã¯ãåŸè ã®å€æŽããµãã¹ã¯ã©ã€ãã§ããããšãæå³ããŸãã ãããŠä»-childrenWidgetsã空ã§ãªãå Žåã¯ããµã€ãã®ããŒãžãæãããŠãã³ã³ãã³ããäœçœ®ã§ãéä»ããããå¿ èŠããããŸãïŒä¿®æ£ããŠå®æãããŠã£ã³ããŠã衚瀺ããããã§ãªãå Žåã¯ãã¹ãŠãè¿ããŸãã
modalWindow3.jsã¢ãŒãã«ãŠã£ã³ããŠèªäœã¯ãããŒãã¹ãã©ããããã®html +ã³ã³ãã³ãã®ãµã€ãºãäœçœ®ãããã³ãã©ãã°ã«å¿ããé 眮èšç®ã§ãããè¶ èªç¶çãªãã®ã§ã¯ãããŸããã å¯äžã®æ©èœã¯ãå éšãŠã£ãžã§ããã®ååãã¿ã€ãã«ãããã³ããã¿ãŒããç£èŠå¯èœãªå€æ°ã«ãã£ãŠå®çŸ©ããããµããŠã£ãžã§ããã«ããããšãã§ãããã©ã¡ãŒã¿ãŒãå€æŽããããšããŠã£ãžã§ãããèªåçã«åäœæãããããšã§ãã ãã®ããã1è¡ãèšè¿°ããå¿ èŠã¯ãããŸããã§ããããã¹ãŠã¯ããŠã£ãžã§ãããã€ã³ãã£ã³ã°ã®updateã¡ãœããã«ãã£ãŠæäŸãããŸãã
ããŒãã£ã³ã°è¡šç€º
Ajaxãªã¯ãšã¹ãã§ã®èªã¿èŸŒã¿ã®æ瀺ã¯ããµã€ãUIã®ãã¢ãªã³ã°ã®1ã€ã§ãã 次ã®ãã©ãŒã ãéä¿¡ãããšãã«ããåŸ ã¡ãã ãããã¢ã€ã³ã³ããããã¢ããããå Žæãçµæãæç»ãããå ŽæïŒç¹ã«ãšã©ãŒãããå ŽåïŒãããã³ç»é¢äžã®æ®ãã®èŠçŽ ã®åŠçïŒå ¥åããããã¯ããæ¹æ³ãšéä¿¡ãã©ãŒã ã§ãŠã£ã³ããŠãéããããšããæ¹æ³ïŒã«ã€ããŠèããå¿ èŠããããã³ã«ã 次ã®ãšã³ãžã³ã¯ãè² è·ã瀺ãããã«ãããã¯ãŒã¯ãšã³ãžã³ã«å®è£ ãããŠããŸãã
EventEmitterã¡ãœããã¯ãåãŠã£ãžã§ããã®ãããã¿ã€ãã«æ··åšããŠããŸãã ãŠã£ãžã§ãããåæåãããšããç¹å¥ãªå€æ°this.requiresLoading = trueãèšå®ãããšãwidgetBindingã¯ãŠã£ãžã§ãããéåæãšèŠãªããããããreadyã€ãã³ããäºæããŸãã ãã ãããŠã£ãžã§ããã¯ç¶æ ã«é¢ä¿ãªãããã«ã¬ã³ããªã³ã°ããããããããŒã¿ãæºåãããŸã§è¡šç€ºãããªãããã«æ³šæããå¿ èŠããããŸãã éåžžãåçŽãªãŠã£ãžã§ããã«ã¯å€æ°this.loading = ko.observableïŒtrueïŒãããããã³ãã¬ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
<!-- uncrd if: loading --> <div class="uncrd-loading-with-icon">...</div> <!-- /uncrd --> <!-- uncrd ifnot: loading --> ... ... <!-- /uncrd -->
ããŒãžã«ãªã³ã¯ããããã¯ãªãã¯ãããšããŠãŒã¶ãŒãããã¡ã€ã«ã§ã¢ãŒãã«ãŠã£ã³ããŠãéãå¿ èŠããããšããŸãã
<a href="#" data-uncrd="click:open.bind($data,{name:'profile',id:123})"> #123</a>.
ã¯ãªãã¯ãããšãã¢ãŒãã«ãŠã£ã³ããŠãéãïŒã¢ãŒãã«ãŠã£ã³ããŠãŠã£ãžã§ããã®èªã¿èŸŒã¿ã¯å¿ èŠãããŸããïŒãå éšã«ãããã¡ã€ã«ããŒã¿ã衚瀺ããããŠãŒã¶ãŒããŒã¿ãèŠæ±ãããšãã«ããŠã³ããŒãã¢ã€ã³ã³ã衚瀺ãããŸãã ããã¯äžåšçšã«æ©èœããŸãããããã¯ãŒã¯å ããµãŒãã£ã³ãããšãã¯ãªãã¯ãããã³ã«ãããŠã³ããŒãã¢ã€ã³ã³ã®ããåã空ã®ã¢ãŒãã«ãŠã£ã³ããŠãæ¯å衚瀺ãããããšãããããŸãã ãããåé¿ããããã«ããŠã£ãžã§ããã®readyã€ãã³ãã䜿çšãããŸãã 次ã®ããã«æžãããšãã§ããŸãïŒ
<a href="#" data-uncrd="click:open.bind($data,{name:'profile',id:123,loading:'after'})"> #123</a> <!-- --> <a class="uncrd-loading-after" href="#" data-uncrd="click:open.bind($data,{name:'profile',id:123})"> #123</a>.
ãããŠãã¯ãªãã¯ããããšãéåæå éšãŠã£ãžã§ãããreadyã€ãã³ããçºè¡ãããŸã§ãã¢ãŒãã«ãŠã£ã³ããŠã¯éããŸããã 代ããã«ãã€ãã³ãã¯ãªãã¯ã€ãã³ããevent.currentTargetèŠçŽ ããããloadingããããã£ãŸãã¯uncss-loading-cssã¯ã©ã¹ã®ååšã確èªããcurrentTargetèŠçŽ ã®æšªã«çµ¶å¯Ÿé 眮ã®èªã¿èŸŒã¿ã¢ã€ã³ã³ãæç»ããŸãã åŸãšã¯ãèŠçŽ ã®åŸãå-åãäž-ãªã³ã¯ã®äžå€®ïŒåçãšã¢ãã¿ãŒå ïŒãæå³ããŸãã ãŠã£ã³ããŠãéãåå ãšãªã£ãèŠçŽ ã«èªã¿èŸŒã¿ã¢ã€ã³ã³ãæ·»ä»ã§ããªãã£ãå Žåã¯ããŠã£ã³ããŠãäžèªç¶ã«éããŸãã åŸè ã®å Žåã¯ãããšãã°ãããŒãžããªããŒãããããšçºçããŸããåæåæã«ãlocation.hashã«å¿ããŠã«ãŒã¿ãŒã¯å¯Ÿå¿ãããŠã£ã³ããŠãéããŸãããããŒã¿ã®ããŒãäžã«ããŒãžäžã®ã©ã®èŠçŽ ã«ã¢ã€ã³ã³ãæç»ããããç¥ããŸããã
ã©ã€ãã©ãªãæ¥ç¶ããŠr.jsã§ã³ã³ãã€ã«ãã
ãããã¯ãŒã¯ã®éèŠãªèŠä»¶ã¯æ倧èªæ²»ã§ããããšãããäžåºŠç¹°ãè¿ããŸãã jqueryãknockoutãå«ããã¹ãŠã®ã©ã€ãã©ãªã¯ããŒã«ã«ã«ååšããã·ã¹ãã ã®ã³ã¢ããããŒããããŸãã ãã®ããããã€ãã£ãã®ã¿ã°ãšå±æ§ã®ä»£ããã«ã¿ã°ãšå±æ§data-uncrd = "..."ã䜿çšããdata-bind = "..."ã䜿çšããã®ã¯ç¡é§ã§ãã ãã¹ãŠã®ã³ã¢ã©ã€ãã©ãªãšã¹ã¯ãªããã¯ããã¢r.jsã䜿çšããŠåäžã®main.jsãã¡ã€ã«ã«ã¢ã»ã³ãã«ãããŸãã ããã§ã®èšå®ã¯build.jsã§ãã ããããå°æ¥çã«ã¯ã åãåå°ãšããŠäœ¿çšããããšãçã«å§ããŸãã äœããã®çç±ã§ãr.jsã§ã¯ãåäžã®ãã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªå šäœãåŠçã§ããŸããã1ã€ã®ã¢ã¯ã·ã§ã³ã§ã«ãŒãã«ãã¡ã€ã«ããmain.jsãã¢ã»ã³ãã«ãããã®é£ã«ãŠã£ãžã§ããã®ãµããã£ã¬ã¯ããªãé 眮ããããšã¯ã§ããŸããã ãŸããmain.jsãã¡ã€ã«ã®require.configïŒ{...}ïŒã䜿çšããŠrequire.jsã«ãããžã§ã¯ããããå Žåãr.jsã䜿çšããŠãã«ããããšãã«ãã®æ§æãèæ ®ãããªããšããäºå®ã«åããå¿ èŠããããŸã-ãã¹ãŠã®ãã¹ã¯ã¢ã»ã³ããªäžã«æå®ãããbuild.jsãã¡ã€ã«ã§åæå®ãããŸãïŒããŒãr.js -o build.jsïŒã
r.jsïŒ ïŒ341 ïŒã§åå空éãæäœãããšãã«ãšã©ãŒãçºçããå¯èœæ§ããããŸããããã¯ãçŸæç¹ã§ã¯ãåå空éãæ£èŠè¡šçŸãä»ããŠdefineããã³requireå€æ°ã«ä»£å ¥ãããããã§ãã knockout.jsã©ã€ãã©ãªã®ã³ãŒãã§ã¯ãamdç°å¢ããã§ãã¯ããæ§æããããã«ç°ãªããåå空éã®èŠåæ§ã¯ããã§æ©èœããŸããã 解決çã¯ãŸã ãããŸãããåºåã確èªããåžžé£ãè¿œå ããããã©ã€ãã©ãªã³ãŒããç·šéããå¿ èŠããããŸãã
ç·Žç¿ããŠããŠã£ãžã§ãããæžã
demoãã©ã³ãã®ãªããžããªã«ãäžèŠãªãã®ããã¹ãŠæããŸããã /demo/1.htmlãã©ã«ããŒã«ã¯ãããããèšè¿°ããããªããã£ããŠã£ãžã§ããã瀺ããã¡ã€ã«ããããŸãã
ãããããŒã®ãŠã£ãžã§ããããå§ããŸããããããã¯ããŠã³ããŒããå¿ èŠãšãããåã«ãããã¡ãã¥ãŒã®ããããŒã衚瀺ããŸãã ãŠã£ãžã§ããã®ããžãã¯ã¯source / widgets / models / topBar.jsã«ããã空ã§ãïŒ
define(function() { var TopBar = function(options) { } return TopBar; });
ãŠã£ãžã§ããã®htmlãã³ãã¬ãŒãã¯ãéåžžã®htmlã¿ã€ãã§ããsource / widgets / templates / topBar.htmlã«ãããŸãã
<div class="navbar navbar-fixed-top uncrd-topbar"> <div class="navbar-inner"> <div class="container"> <a class="brand" href="#">UnCRD</a> <ul class="nav"> <li><a href="#" data-uncrd="click:o('page1')"> </a></li> <li><a href="#" data-uncrd="click:o({name:'page2',param1:'value1',loading:'after'})"> </a></li> <li><a href="#" data-uncrd="click:o({modalWindow:{header:'',content:''}})"> </a></li> </ul> <div class="loginForm" data-uncrd="widget:{name:'loginForm',template:'loginFormInline'}"></div> </div> </div> </div>
TopBarã«ã¯äœãå«ãŸããŠããªããšããäºå®ã«ãããããããwidgetBindingã«ã¯eventEmitterã¡ãœãããæ··åšããŠããããšã«æ³šæããŠãã ããããŠã£ãžã§ããã«ã¯ã1ã€ã®èŠçŽ ïŒå éšãŠã£ãžã§ããloginFormïŒããã®this.childrenWidgetsé åããããŸãã ãŸãããã¹ãŠã®ãŠã£ãžã§ããã«å ±éã®ã¡ãœããthis.destroyïŒãµããŠã£ãžã§ããããªãŒãåé€ïŒãthis.openïŒãŠã£ã³ããŠãéãïŒãthis.oïŒthis.open.bindïŒ...ïŒãè¿ãthis.openã®ç¥ïŒããããŸãã
è€éãªtopBarã åæåäžã«jquery-slowãããŸãè¡ããšä»®å®ããŸãã ãããè¡ãã«ã¯2ã€ã®æ¹æ³ããããŸãã ã«ã¹ã¿ã ãã€ã³ãã£ã³ã°ãèšè¿°ããŠãã³ãã¬ãŒãã®ã«ãŒãèŠçŽ ã«è¿œå ããã®ãããé©åã§ãããã¢ãã«å ã§ãã³ãã¬ãŒãã®DOMã«ã¢ã¯ã»ã¹ã§ããããã«ãããå ŽåããããŸããããã¯ããŠã£ãžã§ãããªããžã§ã¯ããäœæããrenderTemplateãé©çšããåŸã«è¡šç€ºãããŸãã ãã®ããã«domInitã¡ãœãããæäŸãããŸã-æå®ãããå ŽåãrenderTemplateã®åŸã«åŒã³åºããããã©ã¡ãŒã¿ãŒselfïŒãŠã£ãžã§ããèªäœïŒãelementïŒãŠã£ãžã§ãããäœæããDOMèŠçŽ ïŒãfirstDomChildïŒãã³ãã¬ãŒãå ã§æåã«æ€åºãããnodeType = 1åã®DOMèŠçŽ ïŒãæã¡ãŸãïŒ
define(["jquery"],function($) { var TopBar = function(options) { } TopBar.prototype.domInit = function(self,element,firstDomChild) { $(firstDomChild).hide().slideDown(); } return TopBar; });
ãããããŒã®æåã®ãªã³ã¯ãã¯ãªãã¯ãããšãoïŒ 'page1'ïŒã¡ãœãããåŒã³åºãããŸãã ããã¯ãã¢ãŒãã«ãŠã£ã³ããŠãéãããã®äžã«ã¢ãã«/widgets/models/page1.jsãšãã³ãã¬ãŒã/widgets/templates/page1.htmlãæã€ãŠã£ãžã§ãããããŒããããããšãæå³ããŸãã æ£åŒã«ã¯modalWindowãŠã£ãžã§ããã«page1ãå«ãŸããŠãããšããäºå®ã«ãããããããå®éã«ã¯page1ãã¡ã€ã³ãŠã£ãžã§ããã§ãããmodalWindowã¯åãªããã€ã³ãã£ã³ã°ã§ãããããpage1ã¯this.modalWindowããããã£ã§ãã®ãŠã£ã³ããŠã«ã¢ã¯ã»ã¹ã§ããŸãã
define(function() { var Page1 = function(o) { var modalWindow = o.options.modalWindow; if (modalWindow) { modalWindow.width(700); modalWindow.cssPosition("absolute"); this.close = function() { modalWindow.destroy(); // modalWindow, modalWindow } } else { this.close = function() { this.destroy(); } } } return Page1; });
<div> ... ... <a href="#" data-uncrd="click:close"> page1</a> </div>
ããã©ã«ãã§ã¯ãã¢ãŒãã«ãŠã£ã³ããŠã®äœçœ®ã¯åºå®ã§ãã ãŠã£ã³ããŠãéããããšããµã€ãã®ã³ã³ãã³ãã¯ãã§ãŒãdivã«ãã£ãŠæããªãããâæããããŸãã äœçœ®=åºå®ãmarginTop = scrollTopãä»å ãããŠããå Žåãæããªã£ãã³ã³ãã³ãã¯ãã®ãŸãŸæ®ããã¹ã¯ããŒã«ã¯æ¶ããŸãã ã¢ãŒãã«ãŠã£ã³ããŠã®äœçœ®ã絶察ã§ãç»é¢ã®é«ããç»é¢ããã倧ããå Žåãçµæã®ã¹ã¯ããŒã«ã¯ã³ã³ãã³ãã®ã·ããã§ã¯ãªããŠã£ã³ããŠã®ã·ãããå¶åŸ¡ããŸãã ãã¹ãŠã®ãŠã£ã³ããŠãéãããããšãå ã®ããããã£ãã³ã³ãã³ãã«ä»å ãããŸãã ãã®åäœã¯ãäœçœ®ãåºå®ããããã€ã¢ãã°ã衚瀺ããããã®äžã®ã³ã³ãã³ããã¹ã¯ããŒã«ãç¶ãããšããããŒãã¹ãã©ãããããæ£ããããã§ãïŒãããŠãã¢ãŒãã«ãŠã£ã³ããŠãç»é¢ã®é«ãã§çªç¶å€§ãããªããšãã¢ã¿ã³ãçºçããŸãïŒã
éåæããŒãã«ç§»ããŸãããã page2ã衚瀺ããåã«ããŒã¿ãèªã¿èŸŒãå¿ èŠãããããã«ããŸãã this.requiresLoadingãé 眮ããreadyã€ãã³ããçºè¡ããŸããã¢ã³ããŒããããããŒã¿ã䜿çšããŠãŠã£ãžã§ãããããã«è¡šç€ºã§ããããšãå¿ããªãã§ãã ããã
define(["knockout"],function(ko) { var Page2 = function(o) { this.requiresLoading = true; this.loading = ko.observable(true); this.stringFromServer = ko.observable(null); } Page2.prototype.domInit = function(self,element,firstDomChild) { setTimeout(function() { // self.stringFromServer(" "); self.loading(false); self.emit("ready"); },1000); } return Page2; });
<!-- uncrd if: loading --> <div class="uncrd-loading-with-icon">...</div> <!-- /uncrd --> <!-- uncrd ifnot: loading --> <div data-uncrd="text:stringFromServer"></div> <!-- /uncrd -->
ãã®ãŠã£ãžã§ããããããããŒã®æšªã®/demo/1.htmlããŒãžã«çŽæ¥è²Œãä»ããŠãããŒãžããªããŒãããŸãã ãŠã£ãžã§ããã«ã¯ãããŠã³ããŒãã¢ã€ã³ã³ãé¢é£ä»ããå Žæããªããããããã«æç»ãããããŠã³ããŒãã¢ã€ã³ã³ãå éšã«è¡šç€ºãããŸãã ãã ãããããã¡ãã¥ãŒã®page2ãªã³ã¯ãã¯ãªãã¯ãããšããªã³ã¯ã®æšªã«ããŠã³ããŒãã¢ã€ã³ã³ã衚瀺ãããããŒãžã®ããã¢ãŒãã«ãŠã£ã³ããŠãæºåå®äºã®ç¶æ ã§è¡šç€ºãããŸãã
ã¢ãŒãã«ãŠã£ã³ããŠã®ããããã£ã¯å éšãŠã£ãžã§ããããèšå®ã§ããŸãããåªå é äœãäœãããŠãopenã¡ãœããã§çŽæ¥æå®ã§ããŸãã ããšãã°ãå éšãŠã£ãžã§ããã®ååãæå®ããå¿ èŠã¯ãŸã£ãããããŸãããã代ããã«ã³ã³ãã³ãããããã£ãæå®ããŸãã次ã«ãããã¹ãä»ãã®éåžžã®ã¢ãŒãã«ãŠã£ã³ããŠã衚瀺ãããŸãã
<a href="#" data-uncrd="click:o({modalWindow:{header:'',content:''}})"> </a>
ãŸãšã
äžç·ã«æžãããã·ã³ãã«ãªãŠã£ãžã§ããã è€éãªãŠã£ãžã§ããã¯ããªããžããªhttps://github.com/Kasheftin/uncrdã§ç¢ºèªã§ããŸã ã ãããã¯åãåçŽãªãŠã£ãžã§ããã§ãããããªã¥ãŒã ã倧ããã ãã§ãã ãã®ã·ã¹ãã ã¯ãããã¿ã€ãã¬ãã«ã§éçºäžã§ãã ã©ã€ããµã€ãã§ã®ãããã¿ã€ãã®åäœ-ãã¡ããã芧ãã ãã ïŒ http : //www.photovision.ru http://uncrd.com/docs/1.htmlã®ãã¹ãŠã®ãŠã£ãžã§ãããšããã¥ã¡ã³ãã®äžéšãå«ããã¢ããŒãžãåç §ããŠãã ããã ãã¢ã³ã¢ã®ãã¢ãš3ã€ã®æããªãŠã£ãžã§ããã®ãµã³ãã«ã¯ã ãã¢ãã©ã³ãããããŠã³ããŒãã§ããŸãããã¹ãŠã¯æ¢ã«ããã«ã¢ã»ã³ãã«ãããŠããïŒçžå¯Ÿãã¹ã¯ä¿åãããŠããŸãïŒããã©ãŠã¶ã§/demo/1.htmlãéãã ãã§ãã