рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп, рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛

("рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рдХреЗ рдЫреЛрдЯреЗ рдорд╢реАрдиреАрдХрд░рдг" рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ)

рд░рд┐рдкреАрдЯреЗрдмрд▓ рдХреНрдпрд╛ рд╣реИ?


рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ, рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдЖрджрд┐ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ (рдЬрдирд╕рдВрдЦреНрдпрд╛) рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рддрдВрддреНрд░
рдорд╛рд░реНрдХрдЕрдк рдХреЛрдб рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрд╣рддреЗ рд╣реИрдВ, {{рдореВрдВрдЫ}} рдЯреЗрдореНрдкрд▓реЗрдЯ)ред

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рд╕рд╢рд░реНрдд рд╕рдорд╛рд╡реЗрд╢ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдХреЛрдб рдХреА 90 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдпрд╣ рд╕рдмред

рдмрд╛рд░-рдмрд╛рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣рд░ "рд╡рдпрд╕реНрдХ" рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдк рд░рд╛рдХреНрд╖рд╕реЛрдВ рдХреЗ рд╕рд╛рде рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рддрдВрддреНрд░ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдкреВрдЫ рдирд╣реАрдВ рд╣реИред

рдЙрджрд╛рд╣рд░рдг


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдРрд╕рд╛ рдХреЛрдИ рдбреЗрдЯрд╛ рд╣реИ:
var data = [ { name: "Olga", age: 20, email: "aaa@example.com" }, { name: "Peter", age: 30, email: "bbb@example.com" }, { name: "Ivan", age: 15, email: "ccc@example.com" }, ]; 

рдФрд░ рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрдЯреМрддреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 <ul id="people"> <li><a href="mailto:{{this.email}}">{{this.name}}</a> <b if="this.age > 18">18+</b> </li> <li>No data available</li> </ul> 

рдкрд╣рд▓рд╛ <li> рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИред рдЗрдирдкреБрдЯ рд╕реЗрдЯ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрддреНрд╡ рдХреЛ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдФрд░ рдЧреЛрд▓реВ рдХреЗ рд╕рд╛рде рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рджреВрд╕рд░рд╛ <li> рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рджреЛрд╣рд░рд╛рд╡ рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рдХреЗ рд╕рд╛рде "рдЦрд┐рд▓рд╛рдпрд╛" рд╣реИред

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдм рд╡рд░реНрдгрд┐рдд рд╣реИ рддреЛ рд╣рдорд╛рд░реА рд╕реВрдЪреА рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬрдирд╕рдВрдЦреНрдпрд╛ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИ:
 var list = $("ul#people").repeatable(); // declaring the repeatable list.value = data; // that's data population, sic! 

рдпрд╣рд╛рдБ рдПрдХ рдЬреАрддрд╛ рдЬрд╛рдЧрддрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ ред

рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЙрд░реНрдореЗрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ



рдорд╛рд░реНрдХрдЕрдк рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди рдХреЗ рдЕрдВрджрд░ рдХреЗ рдкрд╛рда рдореЗрдВ "рдореВрдВрдЫ" рдХреЛрд╖реНрдардХ рдореЗрдВ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ: {{ ...expr ...}} ред
рд╕реВрдЪреА рднрд░рддреЗ рд╕рдордп, рдРрд╕реЗ рднрд╛рд╡реЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЙрдирдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ


рд╕рд╢рд░реНрдд рд╕рдорд╛рд╡реЗрд╢рди

рдПрдХ рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рднреА рддрддреНрд╡ рдХреЛ рд╕рд╢рд░реНрдд рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдгрди рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ if="...expr..." ред рд╕реВрдЪреА рдмрдирд╛рддреЗ рд╕рдордп, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдпрджрд┐ рдпрд╣ "рд╕рддреНрдп" рд╣реИ, рддреЛ рддрддреНрд╡ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрджрд┐ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛ред

рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рдкреНрд▓рдЧрдЗрди рд╣реЛрдордкреЗрдЬ - рдпрд╣рд╛рдВ
рджреЛрд╣рд░рд╛рдиреЗ рдпреЛрдЧреНрдп рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣реИ рдЬреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдВрдХ рд╕реЗ рдЪреВрдХ рдЧрдП рдереЗ:
 /** * @author Andrew Fedoniouk <andrew@terrainformatica.com> * @name jQuery repeatable() * @license WTFPL (http://sam.zoy.org/wtfpl/) * @purpose template-less population of repeatables (lists) */ (function ($) { function repeatable(el) { var $el = $(el); var template = $el.find(">*").remove(); var nrTemplate = template.length > 1 ? $(template[1]) : null; // "no records" template template = $(template[0]); var compiled = {}; // compiled expressions var vector = null; // data var index = 0; // current index being processed //function evalExpr(str) { return eval("(" + str + ")"); } function compiledExpr(str) { var expr = compiled[str]; if( !expr ) compiled[str] = expr = new Function("$index","$first","$last","$total", "return (" + str + ")"); return expr; } function replace(text, data) { function subst(a, b) { var expr = compiledExpr(b); var s = expr.call(data, index, index==0,index==vector.length - 1, vector.length); return s === undefined ? "" : s; } return text.replace(/{{(.*)}}/g, subst); } function instantiate(el, data) { var attributes = el.attributes; for (var i = 0; i < attributes.length; ++i) { var attribute = attributes[i]; if (attribute.name == "if") { var str = attribute.value; var expr = compiledExpr(str); var tokeep = expr.call(data, index, index == 0, index == vector.length - 1, vector.length); if (!tokeep) { el.parentElement.removeChild(el); return; } } else if (attribute.value.indexOf("{{") >= 0) attribute.value = replace(attribute.value, data); } for (var nn, n = el.firstChild; n; n = nn) { var nn = n.nextSibling; if (n.nodeType == 1) // element instantiate(n, data); else if (n.nodeType == 3) // text { var t = n.textContent; if (t.indexOf("{{") >= 0) n.textContent = replace(t, data); } } } function getValue() { return vector; } function setValue(newValue) { vector = newValue; var t = template[0]; if( !vector || vector.length == 0 ) { $el.empty(); if(nrTemplate) $el.append(nrTemplate); // no records } else { var fragment = document.createDocumentFragment(); for (index = 0; index < vector.length; ++index) { var nel = t.cloneNode(true); instantiate(nel, vector[index]); fragment.appendChild(nel); } $el.empty(); $el.append(fragment); } } el.getValue = getValue; el.setValue = setValue; // redefine its 'value' property, setting value to some array will cause popupaltion of the repeatable by that data. try { Object.defineProperty(el, "value", { get: getValue, set: setValue, enumerable: true, configurable: true }); } catch(e) {} return el; } $.fn.repeatable = function () { var el = null; this.each(function () { el = repeatable(this); }); return el; // returns last matched element! }; })(jQuery); 

рдЧреБрдб рд▓рдХред

Source: https://habr.com/ru/post/In211590/


All Articles