Handlebars.js: рдЧрддрд┐рд╢реАрд▓ рдЖрдВрд╢рд┐рдХ рдмреНрд▓реЙрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 11 рдЕрдЧре░ 2017  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: handlebars-lang/handlebars.js

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдмреНрд▓реЙрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЖрдВрд╢рд┐рдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рддрд╛рдХрд┐ рдпрджрд┐ рдЙрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдЖрдВрд╢рд┐рдХ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ рддреЛ рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИ?

рдЬрдм рд╣рдо рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЖрдВрд╢рд┐рдХ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореЙрдбрд▓-рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдХреЛрдб рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдЖрдВрд╢рд┐рдХ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЖрдВрд╢рд┐рдХ рдкрдВрдЬреАрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╣рдо рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХреЗрдВ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдбрд╛рдпрдиреЗрдорд┐рдХ рдЖрдВрд╢рд┐рдХ рдкрдВрдЬреАрдХреГрдд рдЖрдВрд╢рд┐рдХ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред

рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрджрд┐ closeBlock helperName рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рддреЛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИ:

diff --git a/lib/handlebars/compiler/helpers.js b/lib/handlebars/compiler/helpers.js
index 3c1a38f..f6295d8 100644
--- a/lib/handlebars/compiler/helpers.js
+++ b/lib/handlebars/compiler/helpers.js
@@ -1,9 +1,11 @@
 import Exception from '../exception';

 function validateClose(open, close) {
-  close = close.path ? close.path.original : close;
+  if (close.hasOwnProperty('path')) {
+    close = close.path ? close.path.original : close.path;
+  }

-  if (open.path.original !== close) {
+  if (close && open.path.original !== close) {
     let errorNode = {loc: open.path.loc};

     throw new Exception(open.path.original + " doesn't match " + close, errorNode);
diff --git a/spec/partials.js b/spec/partials.js
index 266837d..7982677 100644
--- a/spec/partials.js
+++ b/spec/partials.js
@@ -19,6 +19,20 @@ describe('partials', function() {
     shouldCompileToWithPartials(string, [hash, helpers, {dude: partial}], true, 'Dudes: Yehuda (http://yehuda) Alan (http://alan) ');
     shouldCompileToWithPartials(string, [hash, helpers, {dude: partial},, false], true, 'Dudes: Yehuda (http://yehuda) Alan (http://alan) ');
   });
+
+  it('dynamic partials with failover', function() {
+    var string = 'Dudes: {{#dudes}}{{#> (partial)}}Anonymous {{/}}{{/dudes}}';
+    var partial = '{{name}} ({{url}}) ';
+    var hash = {dudes: [{name: 'Yehuda', url: 'http://yehuda'}, {name: 'Alan', url: 'http://alan'}]};
+    var helpers = {
+      partial: function() {
+        return 'missing';
+      }
+    };
+    shouldCompileToWithPartials(string, [hash, helpers, {dude: partial}], true, 'Dudes: Anonymous Anonymous ');
+    shouldCompileToWithPartials(string, [hash, helpers, {dude: partial},, false], true, 'Dudes: Anonymous Anonymous ');
+  });
+
   it('failing dynamic partials', function() {
     var string = 'Dudes: {{#dudes}}{{> (partial)}}{{/dudes}}';
     var partial = '{{name}} ({{url}}) ';
diff --git a/src/handlebars.yy b/src/handlebars.yy
index ce06498..1df03cf 100644
--- a/src/handlebars.yy
+++ b/src/handlebars.yy
@@ -79,7 +79,7 @@ inverseChain
   ;

 closeBlock
-  : OPEN_ENDBLOCK helperName CLOSE -> {path: $2, strip: yy.stripFlags($1, $3)}
+  : OPEN_ENDBLOCK helperName? CLOSE -> {path: $2, strip: yy.stripFlags($1, $3)}
   ;

 mustache

рдмреЗрд╢рдХ, рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд┐рд╕реА рднреА рдмреНрд▓реЙрдХ рдХреЛ {{/}} рд╕рд╛рде рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдЪрд┐рдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИред validateClose рдореЗрдВ рдХреЗрд╡рд▓ рдЦрд╛рд▓реА рдмрдВрдж рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм open.type === 'SubExpression' , рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЖрдВрд╢рд┐рдХ рдмреНрд▓реЙрдХ рдХреЛ рдЦрд╛рд▓реА рдмрдВрдж рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рдЦреБрд▓реА рдЗрдЪреНрдЫрд╛ SubExpression )ред

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк partialName рдХреЛ closeBlock :

diff --git a/spec/partials.js b/spec/partials.js
index 266837d..4800d3f 100644
--- a/spec/partials.js
+++ b/spec/partials.js
@@ -19,6 +19,20 @@ describe('partials', function() {
     shouldCompileToWithPartials(string, [hash, helpers, {dude: partial}], true, 'Dudes: Yehuda (http://yehuda) Alan (http://alan) ');
     shouldCompileToWithPartials(string, [hash, helpers, {dude: partial},, false], true, 'Dudes: Yehuda (http://yehuda) Alan (http://alan) ');
   });
+
+  it('dynamic partials with failover', function() {
+    var string = 'Dudes: {{#dudes}}{{#> (partial)}}Anonymous {{/(partial)}}{{/dudes}}';
+    var partial = '{{name}} ({{url}}) ';
+    var hash = {dudes: [{name: 'Yehuda', url: 'http://yehuda'}, {name: 'Alan', url: 'http://alan'}]};
+    var helpers = {
+      partial: function() {
+        return 'missing';
+      }
+    };
+    shouldCompileToWithPartials(string, [hash, helpers, {dude: partial}], true, 'Dudes: Anonymous Anonymous ');
+    shouldCompileToWithPartials(string, [hash, helpers, {dude: partial},, false], true, 'Dudes: Anonymous Anonymous ');
+  });
+
   it('failing dynamic partials', function() {
     var string = 'Dudes: {{#dudes}}{{> (partial)}}{{/dudes}}';
     var partial = '{{name}} ({{url}}) ';
diff --git a/src/handlebars.yy b/src/handlebars.yy
index ce06498..2d63945 100644
--- a/src/handlebars.yy
+++ b/src/handlebars.yy
@@ -79,7 +79,7 @@ inverseChain
   ;

 closeBlock
-  : OPEN_ENDBLOCK helperName CLOSE -> {path: $2, strip: yy.stripFlags($1, $3)}
+  : OPEN_ENDBLOCK partialName CLOSE -> {path: $2, strip: yy.stripFlags($1, $3)}
   ;

 mustache

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЧрддрд┐рд╢реАрд▓ рдЖрдВрд╢рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЗрддрдиреА рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП openPartialBlock рдФрд░ closeBlock рдореЗрдВ рдЙрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░рдирд╛ рдХрд╛рдлреА рдХрдард┐рди рд╣реЛрдЧрд╛ред

рдореИрдВ рдПрдХ рдЙрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд╛рд▓реЗ openPartialBlock рдХреЛ рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрд╛ рдЬреЛ рдореМрдЬреВрджрд╛ рдЖрдВрд╢рд┐рдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╕рдВрдмрджреНрдз рд╣реИред рдореБрдЭреЗ рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рд╕реБрдирдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рдФрд░ рдЕрдЧрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░ рдЖрдо рд╕рд╣рдорддрд┐ рд╣реЛ рддреЛ рдореБрдЭреЗ рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╕ рдПрдХ SO рдереНрд░реЗрдб рдореЗрдВ рдЖрдпрд╛ рдЬреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЧрддрд┐рд╢реАрд▓ рдЖрдВрд╢рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд▓реЙрдХ-рд╕реНрддрд░реАрдп рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ _today_ рдЗрд╕ 'lil рд╣реИрдХ' рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

{{#>( lookup . 'intendedTemplate' )}}
  No template matched for "{{intendedTemplate}}"
 {{/undefined}}

рдЕрдкрдиреЗ рдХреНрд▓реЛрдЬрд┐рдВрдЧ рдЯреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ {{/undefined}} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдХрдо рд╕реЗ рдХрдо рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдХреА рд▓рдЧрддрд╛ рд╣реИред рдлрд┐рд░ рднреА - рднрд▓реЗ рд╣реА рдЗрд╕рдореЗрдВ @nknapp рдХреЗ рд╕реБрдЭрд╛рдП рдЧрдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╕реБрдВрджрд░рддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ - рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рд╕рднреА 11 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬрд┐рд╕реЗ рдЗрдирд▓рд╛рдЗрди рдкрд╛рд░реНрдЯрд┐рдХрд▓реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫрд╛ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

{{#*dynamic (partialName)}}
Fallback content
{{/dynamic}}

рдпрд╣ рдЬрд╛рдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ #1372 рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдирд╣реАрдВ, рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдЧреВрдВрдЧрд╛ рдереАред рдпрд╣ рдХреЛрдИ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рднреА рд╣реЛ, рддреЛ рд╡рд╣ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╣рд╛рдпрдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдЖрдВрд╢рд┐рдХ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗред
рдпрджрд┐ рдЖрдк Handlebars.registeryDecorator('dynamic',...) рдкрд╣рд▓реЗ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ {{#*dynamic ...}} рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдпрдж рдПрдХ рдмрд╣реБрдд рд╣реА рдЦрд░рд╛рдм рд╕рдорд╛рдзрд╛рди рд╣реИред рдореБрдЭреЗ рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ ...

рдЗрд╕ рддрд░рд╣ рдХреБрдЫ "рд╕рднреА" рд▓рд╛рдкрддрд╛ рдЖрдВрд╢рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

const Handlebars = require('handlebars')

Handlebars.registerDecorator('onMissingPartial', function(program, props, container, decoratorContext) {
  const invokePartialWrapper = container.invokePartial
  container.invokePartial = function (partial, context, options) {
    if (props.partials[options.name]) {
      return invokePartialWrapper.apply(this, Array.prototype.slice.call(arguments))
    }
    return decoratorContext.fn(Object.assign({partialName: options.name, context}))
  }
});

var template = Handlebars.compile(`
{{#*inline "inlinePartial"}}
inlinePartial
{{/inline}}

{{#*onMissingPartial}}
Partial "{{partialName}}" could not be found
{{/onMissingPartial}}

{{>inlinePartial}}
{{>unknownPartial}}
`)

console.log("output", template({name: 'myPartial2'}))

рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ

Partial "unknownPartial" could not be found

рдпрд╣ {{> (name) }} рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ #1372 рдХреЗ рд╕рдорд╛рди рдПрдХ рдмрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдирдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдПрдХ рдпреБрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (#1277), рдФрд░ рдЗрд╕ рд╕рдордп, рдХреЛрдИ рднреА рдПрдХ рд▓рд┐рдЦ рд░рд╣рд╛ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реВрдВрдЧрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рдП рдЧрдП {{/}} рдХреНрд▓реЛрдЬрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдЬрд╛рдКрдВрдЧрд╛ред

рдпрджрд┐ рдЖрдк Handlebars.registeryDecorator('dynamic',...) рдкрд╣рд▓реЗ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ {{#*dynamic ...}} рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдХреЛрдб рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА dynamic рдбреЗрдХреЛрд░реЗрдЯрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдЗрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдЖрдк рдЗрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди {{#*...}} рдЕрд░реНрде рд╣реИ "рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ", рдЗрд╕рд▓рд┐рдП {{#* dyamic}} рдХрд╛ рдЕрд░реНрде "рдбреЗрдХреЛрд░реЗрдЯрд░" рднреА рд╣реЛрдЧрд╛ред {{#*inline}} рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдВрд╢рд┐рдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдбрд╛рдпрдиреЗрдорд┐рдХ рдмреНрд▓реЙрдХ-рдкрд╛рд░реНрдЯрд┐рдХрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИред

рдХреЗ рдмрд╛рдж рд╕реЗ {{helper}} рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ {{#block-helper}}...{{/block-helper}} рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ {{>partial}} рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ {{#>block-partial}}...{{/block-partial}} , рдФрд░ {{> (dynamic-partial}} рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ {{#> (dynamic-block) }} рддрд╛рд░реНрдХрд┐рдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдХреЗрд╡рд▓ рдЧрд╛рдпрдм рдЪреАрдЬ рдЕрдВрдд рдЯреИрдЧ рд╣реИ рдФрд░ {{/}} рддрд╛рд░реНрдХрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИред (рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ)ред

рдбрд╛рдпрдиреЗрдорд┐рдХ рдкрд╛рд░реНрдЯрд┐рдХрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдлрд╝реЗрд▓рдУрд╡рд░ рд╕рд╛рдордЧреНрд░реА рдмреНрд▓реЙрдХ рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ _fantastic_ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЖрдВрджреЛрд▓рди рд╣реБрдЖ рд╣реИ? рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдореИрдВ рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛: рдПрдЪрдмреАрдПрд╕ рдХреЗ рдХрд┐рд╕реА рднреА/рд╕рднреА рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЛ рдЙрдирдХреЗ рд╢рд╛рдирджрд╛рд░ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд !)

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╕ рдПрдХ SO рдереНрд░реЗрдб рдореЗрдВ рдЖрдпрд╛ рдЬреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЧрддрд┐рд╢реАрд▓ рдЖрдВрд╢рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд▓реЙрдХ-рд╕реНрддрд░реАрдп рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ _today_ рдЗрд╕ 'lil рд╣реИрдХ' рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

{{#>( lookup . 'intendedTemplate' )}}
  No template matched for "{{intendedTemplate}}"
 {{/undefined}}

рдЕрдкрдиреЗ рдХреНрд▓реЛрдЬрд┐рдВрдЧ рдЯреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ {{/undefined}} рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдХрдо рд╕реЗ рдХрдо рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдХреА рд▓рдЧрддрд╛ рд╣реИред рдлрд┐рд░ рднреА - рднрд▓реЗ рд╣реА рдЗрд╕рдореЗрдВ @nknapp рдХреЗ рд╕реБрдЭрд╛рдП рдЧрдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╕реБрдВрджрд░рддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ - рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рд╕рднреА рд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж рдкреАрдЖрд░ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЦрд╛рд▓реА рд╕рдорд╛рдкрди рдмреНрд▓реЙрдХ рдЕрдиреНрдп рдЖрдВрд╢рд┐рдХ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдЬ рд╕рдм рдХреБрдЫ рд╡рд╛рдкрд╕ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рд╕реЛрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдм # 1422 рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, @jstewmonред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп @wycats рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛
рдпрджрд┐/рдЬрдм рдпрд╣ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣реИрдВ:

1) рдореИрдВ {{#> (partial)}}failover content{{/}} рдЬреИрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ "рдЖрдВрд╢рд┐рдХ" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрджрд╛ рдЖрдВрд╢рд┐рдХ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
2) рдЗрд╕ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдХреИрд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ?
3) рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ 4.1 рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдпрджрд┐ @wycats рд╕реНрд╡реАрдХреГрдд рд╣реИ), рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреАрдЖрд░ рдХреЛ 4.x -branch рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдмрд╛рдж рдореЗрдВ рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╡рд┐рд▓рдп рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреВрдВрдЧрд╛ред

#1422 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд╡рд┐рд▓рдп рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

snimavat picture snimavat  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

asgraf picture asgraf  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

DylanPiercey picture DylanPiercey  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amirzandi picture amirzandi  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rhariraman picture rhariraman  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ