mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Fixes #541 - Fixed handling of placeholders in string attribute value
This commit is contained in:
parent
d91fc9efa8
commit
271b726ecc
@ -49,6 +49,7 @@ function flattenAttrConcats(node) {
|
|||||||
|
|
||||||
function generateCodeForExpressionAttr(name, value, escape, codegen) {
|
function generateCodeForExpressionAttr(name, value, escape, codegen) {
|
||||||
var flattenedConcats = flattenAttrConcats(value);
|
var flattenedConcats = flattenAttrConcats(value);
|
||||||
|
|
||||||
var hasLiteral = false;
|
var hasLiteral = false;
|
||||||
var builder = codegen.builder;
|
var builder = codegen.builder;
|
||||||
var finalNodes = [];
|
var finalNodes = [];
|
||||||
@ -64,7 +65,7 @@ function generateCodeForExpressionAttr(name, value, escape, codegen) {
|
|||||||
|
|
||||||
|
|
||||||
for (let i=0; i<flattenedConcats.length; i++) {
|
for (let i=0; i<flattenedConcats.length; i++) {
|
||||||
if (flattenedConcats[i].type === 'Literal') {
|
if (flattenedConcats[i].type === 'Literal' || flattenedConcats[i].type === 'AttributePlaceholder') {
|
||||||
hasLiteral = true;
|
hasLiteral = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,6 +65,8 @@ class HtmlElementVDOM extends Node {
|
|||||||
} else if (typeof literalValue === 'number') {
|
} else if (typeof literalValue === 'number') {
|
||||||
value.value = literalValue.toString();
|
value.value = literalValue.toString();
|
||||||
}
|
}
|
||||||
|
} else if (value.type === 'AttributePlaceholder') {
|
||||||
|
value = codegen.builder.functionCall(context.helper('str'), [value]);
|
||||||
}
|
}
|
||||||
|
|
||||||
attributesArg[name] = value;
|
attributesArg[name] = value;
|
||||||
|
|||||||
@ -1,15 +1,15 @@
|
|||||||
var marko_template = module.exports = require("marko/html").t(__filename),
|
var marko_template = module.exports = require("marko/html").t(__filename),
|
||||||
marko_helpers = require("marko/runtime/html/helpers"),
|
marko_helpers = require("marko/runtime/html/helpers"),
|
||||||
marko_classAttr = marko_helpers.ca,
|
marko_classAttr = marko_helpers.ca,
|
||||||
marko_attr = marko_helpers.a,
|
marko_str = marko_helpers.s,
|
||||||
marko_escapeXmlAttr = marko_helpers.xa,
|
marko_escapeXmlAttr = marko_helpers.xa;
|
||||||
marko_str = marko_helpers.s;
|
|
||||||
|
|
||||||
function render(data, out) {
|
function render(data, out) {
|
||||||
out.w("<div" +
|
out.w("<div" +
|
||||||
marko_classAttr(data.className) +
|
marko_classAttr(data.className) +
|
||||||
marko_attr("class2", data.className, false) +
|
" class2=\"" +
|
||||||
" foo=\"a" +
|
marko_str(data.className) +
|
||||||
|
"\" foo=\"a" +
|
||||||
marko_escapeXmlAttr(data.foo) +
|
marko_escapeXmlAttr(data.foo) +
|
||||||
"b\" bar=\"a " +
|
"b\" bar=\"a " +
|
||||||
marko_escapeXmlAttr(data.foo) +
|
marko_escapeXmlAttr(data.foo) +
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
<input type="checkbox" checked="${data.checked}">
|
<input type="checkbox" checked=data.checked>
|
||||||
|
|
||||||
<button disabled>Button</button>
|
<button disabled>Button</button>
|
||||||
|
|
||||||
<select>
|
<select>
|
||||||
<option value="${option.value}"
|
<option value="${option.value}"
|
||||||
selected="${option.selected}"
|
selected=option.selected
|
||||||
for(option in data.options)>
|
for(option in data.options)>
|
||||||
|
|
||||||
${option.value}
|
${option.value}
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
<img alt="${data.myAlt || true}">
|
<img alt=(data.myAlt || true)>
|
||||||
|
|||||||
1
test/autotests/render/attr-value-obj/expected.html
Normal file
1
test/autotests/render/attr-value-obj/expected.html
Normal file
@ -0,0 +1 @@
|
|||||||
|
<div data-foo="Frank"></div><div data-foo='{"name":"Frank"}'></div>
|
||||||
9
test/autotests/render/attr-value-obj/template.marko
Normal file
9
test/autotests/render/attr-value-obj/template.marko
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
var foo = {
|
||||||
|
name: 'Frank',
|
||||||
|
toString: function() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
<div data-foo="${foo}"/>
|
||||||
|
<div data-foo=foo/>
|
||||||
1
test/autotests/render/attr-value-obj/test.js
Normal file
1
test/autotests/render/attr-value-obj/test.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
exports.templateData = {};
|
||||||
@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
<div class="tabs">
|
<div class="tabs">
|
||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs">
|
||||||
<li class="${tab.liClass}" for(tab in tabs)>
|
<li class=tab.liClass for(tab in tabs)>
|
||||||
<a href="#${tab.id}" data-toggle="tab">
|
<a href="#${tab.id}" data-toggle="tab">
|
||||||
${tab.title}
|
${tab.title}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div id="${tab.id}" class="${tab.divClass}" for(tab in tabs)>
|
<div id=tab.id class=tab.divClass for(tab in tabs)>
|
||||||
<invoke tab.renderBody(out) if(tab.renderBody) />
|
<invoke tab.renderBody(out) if(tab.renderBody) />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<div class="tabs">
|
<div class="tabs">
|
||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs">
|
||||||
<li class="${tab.liClass}" for(tab in tabs)>
|
<li class=tab.liClass for(tab in tabs)>
|
||||||
<a href="#${tab.id}" data-toggle="tab">
|
<a href="#${tab.id}" data-toggle="tab">
|
||||||
${tab.title}
|
${tab.title}
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user