РазлиÑнÑÑ ÑаблоннÑÑ ÑиÑÑем â много.
Ðни поÑÑепенно ÑволÑÑиониÑовали и ÑазвивалиÑÑ.
Ð ÑÑой главе Ð¼Ñ ÑазбеÑÑм, как ÑÑл ÑÑÐ¾Ñ Ð¿ÑоÑеÑÑ, какие Ñаблонки «ÑодилиÑÑ», какие бонÑÑÑ Ð½Ð°Ð¼ даÑÑ Ð¸ÑполÑзование Ñой или иной Ñаблонной ÑиÑÑемÑ.
ÐикÑоÑаблонÑ
ÐикÑоÑÐ°Ð±Ð»Ð¾Ð½Ñ (англ. microtemplate) Ð¼Ñ Ñже видели на пÑимеÑе _.template.
ÐÑо HTML Ñо вÑÑавками пеÑеменнÑÑ Ð¸ пÑоизволÑнÑм JS.
ÐÑимеÑ:
<div class="menu">
<span class="title"><%-title%></span>
<ul>
<% items.forEach(function(item) { %>
<li><%-item%></li>
<% }); %>
</ul>
</div>
Ð¨Ð°Ð±Ð»Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема компилиÑÑÐµÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´ в JavaScript-ÑÑнкÑÐ¸Ñ Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑми модиÑикаÑиÑми, и она Ñже, запÑÑÑивÑиÑÑ Ñ Ð´Ð°Ð½Ð½Ñми, генеÑиÑÑÐµÑ ÑезÑлÑÑаÑ.
ÐоÑÑоинÑÑва и недоÑÑаÑки Ñакого Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð°:
- ÐÑÑÑко пÑивÑзан к ÑзÑÐºÑ JavaScript.
- ÐÑи оÑибке в Ñаблоне пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ Ð»ÐµÐ·ÑÑ Ð²Ð½ÑÑÑÑ Â«ÑÑÑаÑной» ÑÑнкÑии
- ÐÑоÑÑÐ°Ñ Ð¸ бÑÑÑÑÐ°Ñ ÑÐ°Ð±Ð»Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема
- ÐнÑÑÑи JS-ÑÑнкÑии доÑÑÑпен полноÑеннÑй бÑаÑзеÑнÑй оÑладÑик, ÑÑнкÑÐ¸Ñ Ñ Ð¾ÑÑ Ð¸ ÑÑÑаÑна, но понÑÑна.
Ðод в Ñаблоне
ÐклÑÑение пÑоизволÑного JS-кода в Ñаблон, в ÑеоÑии, позволÑÐµÑ Ð´ÐµÐ»Ð°ÑÑ Ð² нÑм вÑÑ, ÑÑо Ñгодно. Ðо обÑаÑÐ½Ð°Ñ ÑÑоÑона медали â Ñаблон вмеÑÑо внÑÑного HTML Ð¼Ð¾Ð¶ÐµÑ ÑÑаÑÑ Ð°Ð´Ñким нагÑомождением ÑазделиÑелей впеÑемеÑÐºÑ Ñ Ð²ÑÑиÑлениÑми. ЧÑо ÑекомендÑеÑÑÑ Ð´ÐµÐ»Ð°ÑÑ Ð² ÑÐ°Ð±Ð»Ð¾Ð½Ð°Ñ , а ÑÑо неÑ?
Ðожно ÑазделиÑÑ ÐºÐ¾Ð´ на два Ñипа Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ÑаблонизаÑии:
- ÐизнеÑ-логика â код, ÑоÑмиÑÑÑÑий даннÑе, оÑновной код пÑиложениÑ.
- ÐÑезенÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ° â код, опиÑÑваÑÑий, как показÑваÑÑÑÑ Ð´Ð°Ð½Ð½Ñе.
ÐапÑимеÑ, код, полÑÑаÑÑий даннÑе Ñ ÑеÑвеÑа Ð´Ð»Ñ Ð²Ñвода в ÑаблиÑе â бизнеÑ-логика, а код, ÑоÑмаÑиÑÑÑÑий даÑÑ Ð´Ð»Ñ Ð²Ñвода â пÑезенÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ°.
Ð ÑÐ°Ð±Ð»Ð¾Ð½Ð°Ñ Ð´Ð¾Ð¿ÑÑÑима лиÑÑ Ð¿ÑезенÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ°.
ÐÑоÑÑ-плаÑÑоÑменноÑÑÑ
ÐаÑаÑÑÑÑ, нÑжно иÑполÑзоваÑÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ Ñаблон и в бÑаÑзеÑе и на ÑеÑвеÑе.
ÐапÑимеÑ, ÑеÑвеÑнÑй код генеÑиÑÑÐµÑ HTML Ñо ÑпиÑком ÑообÑений, а JavaScript на клиенÑе добавлÑÐµÑ Ðº Ð½ÐµÐ¼Ñ Ð½Ð¾Ð²Ñе по меÑе поÑвлениÑ.
â¦Ðо как иÑполÑзоваÑÑ Ð½Ð° ÑеÑвеÑе Ñаблон Ñ JavaScript, еÑли его оÑновной ÑзÑк â PHP, Ruby, Java?
ÐÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ обойÑи. Ðа ÑеÑвеÑ, иÑполÑзÑÑÑем PHP, Ruby, Java или какой-Ñо дÑÑгой ÑзÑк, дополниÑелÑно ÑÑавиÑÑÑ Ð²Ð¸ÑÑÑалÑÐ½Ð°Ñ Ð¼Ð°Ñина V8 и наÑÑÑаиваеÑÑÑ Ð¸Ð½ÑегÑаÑÐ¸Ñ Ñ Ð½ÐµÐ¹. ÐоÑÑи вÑе плаÑÑоÑÐ¼Ñ ÑÑо ÑмеÑÑ.
ÐоÑле ÑÑого ÑÑановиÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм запÑÑкаÑÑ JavaScript-ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð¸ пеÑедаваÑÑ Ð¸Ð¼ даннÑе в виде обÑекÑов, маÑÑивов и Ñак далее.
ÐÑÐ¾Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð¸ÑкÑÑÑÑвеннÑм, но на Ñамом деле он вполне жизнеÑпоÑобен и иÑполÑзÑеÑÑÑ Ð² ÑÑде кÑÑпнÑÑ Ð¿ÑоекÑов.
ÐÑекомпилÑÑиÑ
ÐÑа Ñаблонка и болÑÑинÑÑво дÑÑÐ³Ð¸Ñ ÑиÑÑем, коÑоÑÑе Ð¼Ñ ÑаÑÑмоÑÑим далее, допÑÑкаÑÑ Ð¿ÑекомпилÑÑиÑ.
То еÑÑÑ, можно заÑанее, до вÑкладÑÐ²Ð°Ð½Ð¸Ñ ÑайÑа на «боевой ÑеÑвеÑ», обÑабоÑаÑÑ ÑаблонÑ, ÑоздаÑÑ Ð¸Ð· Ð½Ð¸Ñ JS-ÑÑнкÑии, обÑединиÑÑ Ð¸Ñ Ð² единÑй Ñайл и далее, в «боевом окÑÑжении» иÑполÑзоваÑÑ Ñже Ð¸Ñ .
СовÑеменнÑе ÑиÑÑÐµÐ¼Ñ ÑбоÑки (brunch, grunt Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð°Ð¼Ð¸ и дÑÑгие) позволÑÑÑ Ð´ÐµÐ»Ð°ÑÑ ÑÑо Ñдобно, а Ñакже Ñ ÑаниÑÑ ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð² ÑазнÑÑ ÑÐ°Ð¹Ð»Ð°Ñ , каждÑй â в нÑжной диÑекÑоÑии Ñ JS-кодом Ð´Ð»Ñ Ð²Ð¸Ð´Ð¶ÐµÑа.
ХелпеÑÑ Ð¸ ÑилÑÑÑÑ
JavaScript-вÑÑавки не вÑегда пÑоÑÑÑ Ð¸ ÑлеганÑнÑ. Ðногда, ÑÑÐ¾Ð±Ñ ÑÑо-Ñо ÑделаÑÑ, нÑжно напиÑаÑÑ Ð¿Ð¾ÑÑдоÑно кода.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑделаÑÑ ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑнее и пÑоÑе, в Ð½Ð¸Ñ ÑÑали добавлÑÑÑ ÑилÑÑÑÑ Ð¸ Ñ ÐµÐ»Ð¿ÐµÑÑ.
-
Ð¥ÐµÐ»Ð¿ÐµÑ (англ. helper) â вÑпомогаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð´Ð¾ÑÑÑпна в ÑÐ°Ð±Ð»Ð¾Ð½Ð°Ñ Ð¸ иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ ÑаÑÑо возникаÑÑÐ¸Ñ Ð·Ð°Ð´Ð°Ñ.
Ð
_.template, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÑÑвиÑÑ Ñ ÐµÐ»Ð¿ÐµÑ, можно пÑоÑÑо ÑделаÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ ÑÑнкÑиÑ. Ðо ÑÑо ÑлиÑком гÑÑбо, Ñак не делаÑÑ. ÐоÑаздо лÑÑÑе â иÑполÑзоваÑÑ Ð¾Ð±ÑекÑ_.templateSettings.imports, в коÑоÑом можно ÑказаÑÑ, какие ÑÑнкÑии добавлÑÑÑ Ð² ÑаблонÑ, или опÑиÑimportsдлÑ_.template.ÐÑÐ¸Ð¼ÐµÑ Ñ ÐµÐ»Ð¿ÐµÑа â ÑÑнкÑиÑ
t(phrase), коÑоÑÐ°Ñ Ð¿ÐµÑеводиÑphraseна ÑекÑÑий ÑзÑк:_.templateSettings.imports.t = function(phrase) { // обÑÑно ÑÑнкÑÐ¸Ñ Ð¿ÐµÑевода немного Ñложнее, но здеÑÑ ÑÑо не важно if (phrase == "Hello") return "ÐÑивеÑ"; } // в Ñаблоне иÑполÑзÑеÑÑÑ Ñ ÐµÐ»Ð¿ÐµÑ t Ð´Ð»Ñ Ð¿ÐµÑевода var compiled = _.template("<div><%=t('Hello')%></div>"); alert( compiled() ); // <div>ÐÑивеÑ</div>Такой Ñ ÐµÐ»Ð¿ÐµÑ Ð¾ÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ Ð´Ð»Ñ Ð¼ÑлÑÑиÑзÑÑнÑÑ ÑайÑов, когда один Ñаблон нÑжно вÑводиÑÑ Ð½Ð° деÑÑÑи ÑзÑÐºÐ°Ñ . ÐеÑÑо подобное иÑполÑзÑеÑÑÑ Ð¿Ð¾ÑÑи во вÑÐµÑ ÑзÑÐºÐ°Ñ Ð¸ плаÑÑоÑÐ¼Ð°Ñ , не ÑолÑко в JavaScript.
-
ФилÑÑÑ â ÑÑо ÑÑнкÑиÑ, коÑоÑÐ°Ñ ÑÑанÑÑоÑмиÑÑÐµÑ Ð´Ð°Ð½Ð½Ñе, напÑимеÑ, ÑоÑмаÑиÑÑÐµÑ Ð´Ð°ÑÑ, ÑоÑÑиÑÑÐµÑ ÑлеменÑÑ Ð¼Ð°ÑÑива и Ñак далее.
ÐбÑÑно Ð´Ð»Ñ ÑилÑÑÑов пÑедÑÑмоÑÑен ÑпеÑиалÑнÑй «оÑобо пÑоÑÑой и коÑоÑкий» ÑинÑакÑиÑ.
ÐапÑимеÑ, в ÑиÑÑеме ÑаблонизаÑии EJS, коÑоÑÐ°Ñ Ð¿Ð¾ ÑÑÑи ÑÐ°ÐºÐ°Ñ Ð¶Ðµ, но моÑнее, Ñем
_.template, ÑилÑÑÑÑ Ð·Ð°Ð´Ð°ÑÑÑÑ ÑеÑез Ñимвол|, внÑÑÑи ÑазделиÑелÑ<%=: ... %>.ЧÑÐ¾Ð±Ñ Ð²ÑвеÑÑи
itemÑ Ð±Ð¾Ð»ÑÑой бÑквÑ, можно вмеÑÑо<%=item%>напиÑаÑÑ<%=: item | capitalize %>. ЧÑÐ¾Ð±Ñ Ð²ÑводиÑÑ Ð¾ÑÑоÑÑиÑованнÑй маÑÑив, можно иÑполÑзоваÑÑ<%=: items | sort %>и Ñак далее.
Свой ÑзÑк
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑделаÑÑ Ñаблон еÑÑ ÐºÐ¾ÑоÑе, а Ñакже Ñ ÑелÑÑ Â«Ð¾ÑвÑзаÑÑ» Ð¸Ñ Ð¾Ñ JavaScript, ÑÑд ÑаблоннÑÑ ÑиÑÑем пÑедлагаÑÑ Ñвой ÑзÑк.
ÐапÑимеÑ:
- Mustache
- Handlebars
- Closure Templates
- â¦ÑÑÑÑÑи Ð¸Ñ â¦
Шаблон Ð´Ð»Ñ Ð¼ÐµÐ½Ñ Ð² Handlerbars, к пÑимеÑÑ, бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
<div class="menu">
<span class="title">{{title}}</span>
<ul>
{{#each items}}
<li>{{item}}</li>
{{/each}}
</ul>
<div>
Ðак видно, вмеÑÑо JavaScript-конÑÑÑÑкÑий здеÑÑ Ð¸ÑполÑзÑÑÑÑÑ Ñ
елпеÑÑ. РпÑимеÑе вÑÑе {{#each}} ... {{/each} â «блоÑнÑй» Ñ
елпеÑ: он показÑÐ²Ð°ÐµÑ ÑÐ²Ð¾Ñ ÑодеÑжимое Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа items и ÑвлÑеÑÑÑ Ð°Ð»ÑÑеÑнаÑивой forEach.
ÐÑÑÑ Ð¸ дÑÑгие вÑÑÑоеннÑе в ÑаблонизаÑÐ¾Ñ Ñ ÐµÐ»Ð¿ÐµÑÑ, можно легко делаÑÑ Ñвои.
ÐÑполÑзование Ñакого Ñаблона:
// ÑекÑÑ Ñаблона должен бÑÑÑ Ð² пеÑеменной tmpl
var compiled = Handlebars.compile(tmpl);
var result = compiled({
title: "СладоÑÑи",
items: ["ТоÑÑ", "ÐиÑожное", "ÐонÑик"]
});
ÐиблиоÑека ÑаблонизаÑии Handlebars «понимаеÑ» ÑÑÐ¾Ñ ÑзÑк. ÐÑзов Handlebars.compile пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑÑÑÐ¾ÐºÑ Ñаблона, ÑÐ°Ð·Ð±Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾ ÑазделиÑелÑм и, аналогиÑно пÑедÑдÑÑÐµÐ¼Ñ Ð²Ð¸Ð´Ñ Ñаблонов, Ð´ÐµÐ»Ð°ÐµÑ JavaScript-ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð·Ð°Ñем по даннÑм вÑдаÑÑ ÑÑÑокÑ-ÑезÑлÑÑаÑ.
ÐапÑÐµÑ Ð½Ð° вÑÑÑоеннÑй JS
ÐÑли «Ñвой ÑзÑк ÑаблонизаÑоÑа» оÑÐµÐ½Ñ Ð¿ÑоÑÑ, Ñо библиоÑÐµÐºÑ Ð´Ð»Ñ ÐµÐ³Ð¾ поддеÑжки можно легко напиÑаÑÑ Ð¿Ð¾Ð´ PHP, Ruby, Java и дÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ , коÑоÑÑе Ñем ÑамÑм наÑÑаÑÑÑ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÑÑ Ñакие ÑаблонÑ.
ÐÑли Ñаблонка дейÑÑвиÑелÑна наÑелена на кÑоÑÑ-плаÑÑоÑменноÑÑÑ, Ñо ÑвнÑе JS-вÑÐ·Ð¾Ð²Ñ Ð² ней запÑеÑенÑ. ÐÑÑ Ð´ÐµÐ»Ð°ÐµÑÑÑ ÑеÑез Ñ ÐµÐ»Ð¿ÐµÑÑ.
ÐÑли же нÑжна какаÑ-Ñо логика, Ñо она либо вÑноÑиÑÑÑ Ð²Ð¾ внеÑний код, либо делаеÑÑÑ ÑеÑез новÑй Ñ ÐµÐ»Ð¿ÐµÑ â он оÑделÑно пиÑеÑÑÑ Ð½Ð° JavaScript (Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñа) и Ð´Ð»Ñ ÑеÑвеÑа (на его ÑзÑке). ÐолÑÑаеÑÑÑ Ð¿Ð¾Ð»Ð½Ð°Ñ ÑовмеÑÑимоÑÑÑ.
ÐÑо ÑоздаÑÑ Ð¾Ð¿ÑеделÑннÑе ÑложноÑÑи. ÐапÑимеÑ, в Handlebars еÑÑÑ Ñ
ÐµÐ»Ð¿ÐµÑ {{#if cond}} ... {{/if}}, коÑоÑÑй вÑÐ²Ð¾Ð´Ð¸Ñ ÑодеÑжимое, еÑли иÑÑинно ÑÑловие cond. ÐÑи ÑÑом вмеÑÑо cond нелÑÐ·Ñ Ð¿Ð¾ÑÑавиÑÑ, к пÑимеÑÑ, a > b или вÑзов str.toUpperCase(), бÑÐ´ÐµÑ Ð¾Ñибка. ÐÑе вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑÐ´ÐµÐ»Ð°Ð½Ñ Ð½Ð° ÑÑапе пеÑедаÑи даннÑÑ
в Ñаблон.
Так Ñделано как Ñаз Ð´Ð»Ñ Ð¿ÐµÑеноÑимоÑÑи Ñаблонной ÑиÑÑÐµÐ¼Ñ Ð½Ð° дÑÑгие ÑзÑки, но на пÑакÑике не оÑенÑ-Ñо Ñдобно.
ÐÑодвинÑÑÑе кÑоÑÑ-плаÑÑоÑменнÑе ÑаблонизаÑоÑÑ, в ÑаÑÑноÑÑи, Closure Templates, обладаÑÑ Ð±Ð¾Ð»ÐµÐµ моÑнÑм ÑзÑком и ÑмеÑÑ ÑамоÑÑоÑÑелÑно ÑазбиÑаÑÑ Ð¸ компилиÑоваÑÑ Ð¼Ð½Ð¾Ð³Ð¸Ðµ вÑÑажениÑ.
ШаблонизаÑÐ¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ
Ðо ÑÑого Ð¼Ñ Ð³Ð¾Ð²Ð¾Ñили о ÑаблоннÑÑ ÑиÑÑÐµÐ¼Ð°Ñ Â«Ð¾Ð±Ñего назнаÑениÑ». Ðо болÑÑÐ¾Ð¼Ñ ÑÑÑÑÑ, ÑÑо вÑего лиÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ñ Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки в дÑÑгÑÑ. Ðо пÑи опиÑании Ñаблона Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ Ð¼Ñ Ñ Ð¾Ñим ÑгенеÑиÑоваÑÑ Ð½Ðµ пÑоÑÑо ÑÑÑокÑ, а DOM-ÑлеменÑ, и не пÑоÑÑо генеÑиÑоваÑÑ, а в далÑнейÑем â Ñ Ð½Ð¸Ð¼ ÑабоÑаÑÑ.
СовÑеменнÑе ÑаблоннÑе ÑиÑÑÐµÐ¼Ñ Â«Ð·Ð°ÑоÑенÑ» на ÑÑо. Ðни ÑмеÑÑ ÑоздаваÑÑ Ð¿Ð¾ ÑÐ°Ð±Ð»Ð¾Ð½Ñ DOM-ÑлеменÑÑ Ð¸ авÑомаÑиÑеÑки вÑполнÑÑÑ Ð¿Ð¾Ñле ÑÑого ÑазнÑе полезнÑе дейÑÑвиÑ.
ÐапÑимеÑ:
- Ðожно ÑÐ¾Ñ ÑаниÑÑ Ð²Ð°Ð¶Ð½Ñе подÑлеменÑÑ Ð² ÑвойÑÑва компоненÑÑ, ÑÑÐ¾Ð±Ñ Ð±Ñло пÑоÑе к ним обÑаÑаÑÑÑÑ Ð¸Ð· JavaScript.
- Ðожно авÑомаÑиÑеÑки назнаÑаÑÑ Ð¾Ð±ÑабоÑÑики из меÑодов компоненÑа.
- Ðожно запомниÑÑ, какие даннÑе оÑноÑÑÑÑÑ Ðº каким ÑлеменÑам и в далÑнейÑем, пÑи изменении даннÑÑ Ð°Ð²ÑомаÑиÑеÑки обновлÑÑÑ DOM («пÑивÑзка даннÑÑ Â» â англ. data binding).
Ðдной из пеÑвÑÑ ÑиÑÑем ÑаблонизаÑии, коÑоÑÐ°Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе возможноÑÑи бÑла Knockout.JS.
ÐопÑобÑйÑе поменÑÑÑ Ð·Ð½Ð°Ñение <input> в пÑимеÑе ниже и Ð²Ñ ÑвидиÑе двÑÑ
ÑÑоÑоннÑÑ Ð¿ÑивÑÐ·ÐºÑ Ð´Ð°Ð½Ð½ÑÑ
в дейÑÑвии:
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>
ÐоменÑйÑе имÑ: <input data-bind="value: name, valueUpdate: 'input'">
<hr>
<h1>ÐÑивеÑ, <span data-bind="text: name"></span>!</h1>
<script>
var user = {
name: ko.observable("ÐаÑÑ")
};
ko.applyBindings(user, document.body);
</script>
ÐиблиоÑека Knockout.JS ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ ko, коÑоÑÑй и ÑодеÑÐ¶Ð¸Ñ Ð²Ñе ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи.
Ð ÑÑом пÑимеÑе ÑабоÑÑ Ð½Ð°ÑÐ¸Ð½Ð°ÐµÑ Ð²Ñзов ko.applyBindings(user, document.body).
Ðго аÑгÑменÑÑ:
userâ обÑÐµÐºÑ Ñ Ð´Ð°Ð½Ð½Ñми.document.bodyâ DOM-ÑлеменÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑполÑзован в каÑеÑÑве Ñаблона.
Ðн пÑÐ¾Ð±ÐµÐ³Ð°ÐµÑ Ð¿Ð¾ вÑем подÑлеменÑам document.body и, еÑли Ð²Ð¸Ð´Ð¸Ñ Ð°ÑÑибÑÑ data-bind, Ñо ÑиÑÐ°ÐµÑ ÐµÐ³Ð¾ и вÑполнÑÐµÑ Ð¿ÑивÑÐ·ÐºÑ Ð´Ð°Ð½Ð½ÑÑ
.
ÐнаÑение <input data-bind="value: name, ..."> ознаÑаеÑ, ÑÑо нÑжно пÑивÑзаÑÑ input.value к ÑвойÑÑÐ²Ñ name обÑекÑа даннÑÑ
.
ÐÑивÑзка оÑÑÑеÑÑвлÑеÑÑÑ Ð² две ÑÑоÑонÑ:
-
Ðо-пеÑвÑÑ , библиоÑека ÑÑÐ°Ð²Ð¸Ñ Ð½Ð°
inputÑвой обÑабоÑÑикoninput(можно вÑбÑаÑÑ Ð´ÑÑгие ÑобÑÑиÑ, Ñм. докÑменÑаÑиÑ), коÑоÑÑй бÑÐ´ÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÑÑuser.name. То еÑÑÑ, изменениеinputавÑомаÑиÑеÑки менÑеÑuser.name -
Ðо-вÑоÑÑÑ , ÑвойÑÑво
user.nameÑоздано какko.observable(...). Ð¢ÐµÑ Ð½Ð¸ÑеÑки,ko.observable(value)â ÑÑо ÑÑнкÑиÑ-обÑÑÑка вокÑÑг знаÑениÑ: геÑÑеÑ-ÑеÑÑеÑ, коÑоÑÑй ÑÐ¼ÐµÐµÑ ÑаÑÑÑлаÑÑ ÑобÑÑÐ¸Ñ Ð¿Ñи изменении.ÐапÑимеÑ:
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script> <script> var user = ko.observable("ÐаÑÑ"); // вÑзов user() возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение alert( user() ); // ÐаÑÑ // вÑзов user.subscribe(func) ÑÑÐ°Ð²Ð¸Ñ Ð¾Ð±ÑабоÑÑик на изменение знаÑÐµÐ½Ð¸Ñ user.subscribe(function(newValue) { alert("Ðовое знаÑение: " + newValue); }); // вÑзов user(newValue) менÑÐµÑ Ð·Ð½Ð°Ñение user("ÐеÑÑ"); // ÑÑабоÑÐ°ÐµÑ Ð¾Ð±ÑабоÑÑик, назнаÑеннÑй вÑÑе </script>ÐиблиоÑека Knockout.JS ÑÑÐ°Ð²Ð¸Ñ Ñвой обÑабоÑÑик на изменение знаÑÐµÐ½Ð¸Ñ Ð¸ пÑи ÑÑом обновлÑÐµÑ Ð²Ñе пÑивÑзки. Так ÑÑо пÑи изменении
user.nameменÑеÑÑÑ Ð¸input.value.
Ðалее в Ñом же пÑимеÑе наÑ
одиÑÑÑ <span data-bind="text: name"> â здеÑÑ Ð°ÑÑибÑÑ Ð¾Ð·Ð½Ð°ÑÐ°ÐµÑ Ð¿ÑивÑÐ·ÐºÑ ÑекÑÑа к name. Так как <span> по Ñвоей иниÑиаÑиве менÑÑÑÑÑ Ð½Ðµ можеÑ, Ñо пÑивÑзка одноÑÑоÑоннÑÑ, но еÑли Ð±Ñ Ð¼Ð¾Ð³, Ñо можно ÑделаÑÑ Ð¸ двÑÑ
ÑÑоÑоннÑÑ, ÑÑо неÑложно.
ÐÑзов ko.applyBindings можно делаÑÑ Ð²Ð½ÑÑÑи компоненÑÑ, и Ñаким обÑазом ÑÑÑанавливаÑÑ ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÐµÑ Ð¾Ð±ÑекÑом и DOM.
ÐиблиоÑека Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ñ
Ñанение Ñаблонов в <script type="text/template"> â Ñм. докÑменÑаÑÐ¸Ñ template-binding, можно оÑганизоваÑÑ Ð¿ÑекомпилÑÑиÑ, добавлÑÑÑ Ñвои пÑивÑзки и Ñак далее.
ÐÑÑгие библиоÑеки
ÐÑÑÑ Ð´ÑÑгие библиоÑеки «пÑодвинÑÑой ÑаблонизаÑии», коÑоÑÑе добавлÑÑÑ Ñвои возможноÑÑи по ÑабоÑе Ñ DOM, напÑимеÑ:
ÐÐ¾Ð´Ð¾Ð±Ð½Ð°Ñ ÑÐ°Ð±Ð»Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема ÑвлÑеÑÑÑ ÑаÑÑÑÑ Ð¼Ð½Ð¾Ð³Ð¸Ñ ÑÑеймвоÑков, напÑимеÑ:
ÐÑе ÑÑи ÑÑеймвоÑки ÑазнÑе:
- Ember иÑполÑзÑÐµÑ Ð½Ð°Ð´ÑÑÑÐ¾Ð¹ÐºÑ Ð½Ð°Ð´ Handlebars.
- React иÑполÑзÑÐµÑ JSX (JavaScript XML syntax transform) â Ñвой оÑобÑй ÑпоÑоб вÑÑавки ÑазмеÑки в JS-код, коÑоÑÑй нÑжно обÑзаÑелÑно пÑекомпилиÑоваÑÑ Ð¿ÐµÑед запÑÑком.
- Angular вмеÑÑо ÑабоÑÑ Ñо ÑÑÑоками иÑполÑзÑÐµÑ ÐºÐ»Ð¾Ð½Ð¸Ñование DOM-Ñзлов.
ÐÑи ÑазÑабоÑке ÑовÑеменного веб-пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ ÑмÑÑл вÑбÑаÑÑ Ð¿ÑодвинÑÑÑÑ ÑаблоннÑÑ ÑиÑÑÐµÐ¼Ñ Ð¸Ð»Ð¸ даже один из ÑÑÐ¸Ñ Ð°ÑÑ Ð¸ÑекÑÑÑнÑÑ ÑÑеймвоÑков.
ÐÑого
СиÑÑÐµÐ¼Ñ ÑаблонизаÑии, в поÑÑдке ÑазвиÑÐ¸Ñ Ð¸ ÑÑложнениÑ:
- ÐикÑоÑаблонизаÑÐ¸Ñ â ÑÑÑока Ñ JS-вÑÑавками, коÑоÑÐ°Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»Ð¸ÑÑеÑÑÑ Ð² ÑÑнкÑÐ¸Ñ â ÑамÑй пÑоÑÑой ваÑианÑ, минималÑÐ½Ð°Ñ ÑабоÑа Ð´Ð»Ñ ÑаблонизаÑоÑа.
- СобÑÑвеннÑй ÑзÑк Ñаблонов â «оÑобо пÑоÑÑой» ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ ÑаÑÑÑÑ Ð¾Ð¿ÐµÑаÑий, Ñ Ð·Ð°Ð¿ÑеÑом на JS в ÑлÑÑае, еÑли нÑжна кÑоÑÑ-плаÑÑоÑменноÑÑÑ.
- ШаблонизаÑÐ¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов â ÑовÑеменнÑе ÑиÑÑемÑ, коÑоÑÑе ÑмеÑÑ Ð½Ðµ ÑолÑко генеÑиÑоваÑÑ DOM, но и помогаÑÑ Ñ Ð´Ð°Ð»ÑнейÑей ÑабоÑой Ñ Ð½Ð¸Ð¼.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð¾Ð´Ð½Ð¸ и Ñе же ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð½Ð° клиенÑе и ÑеÑвеÑе, пÑименÑÑÑ Ð»Ð¸Ð±Ð¾ кÑоÑÑ-плаÑÑоÑменнÑÑ ÑиÑÑÐµÐ¼Ñ ÑаблонизаÑии, либо, ÑаÑе â инÑегÑиÑÑÑÑ ÑеÑвеÑнÑÑ ÑаÑÑÑ Ñ V8 и, возможно, Ñ ÑеÑвеÑом Node.JS.
Рглаве бÑло много ÑÑÑлок на ÑаблоннÑе ÑиÑÑемÑ. ÐÑе они доÑÑаÑоÑно ÑовÑеменнÑе, поддеÑживаемÑе и иÑполÑзÑÑÑÑÑ Ð²Ð¾ Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð¿ÑоекÑÐ°Ñ . СÑеди Ð½Ð¸Ñ Ð²Ñ Ð½Ð°Ð²ÐµÑнÑка найдÑÑе нÑжнÑÑ Ð²Ð°Ð¼.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)