Skip to content

Commit ff4944b

Browse files
authored
Merge pull request #108 from lukebayes/lbj-rerender
Fixed bug were value='0' attributes disappear on re-render
2 parents d7936ae + cc553a7 commit ff4944b

File tree

4 files changed

+42
-6
lines changed

4 files changed

+42
-6
lines changed

examples/client/client.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const DOM_CONTENT_LOADED = 'DOMContentLoaded';
66

77
function client(doc) {
88
// Render the application immediately. This can begin before the DOM is fully ready.
9-
const app = renderElement(dom.h1('HELLO WORLD 34343'), doc);
9+
const app = renderElement(dom.h1('HELLO WORLD'), doc);
1010

1111
ready(doc, () => {
1212
// Get the element where we will attach the application.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"description": "Nomplate: Node template engine",
55
"main": "index.js",
66
"engines": {
7-
"node": ">=12.4.0"
7+
"node": ">=12.4.1"
88
},
99
"bugs": "https://github.com/lukebayes/nomplate/issues",
1010
"homepage": "https://github.com/lukebayes/nomplate",

src/render_element.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,8 @@ function elementAttributesToOperations(ops, nomElement, optDomElement) {
221221
}
222222
} else if (optDomElement) {
223223
const domValue = optDomElement.getAttribute(keyWithCase);
224-
if (!value && domValue !== 'false' && domValue !== false && domValue !== 0) {
225-
// Remove attributes that transition to falsy values:
224+
if (value === '' || value === undefined || value === null || value === NaN) {
225+
// Remove invalid/empty-ish attribute values
226226
ops.push(operations.removeAttribute(keyWithCase, value));
227227
} else if (value != domValue) {
228228
// Update attributes with new values:
@@ -284,7 +284,7 @@ function nomElementToOperations(ops, nomElement, doc, optDomElement) {
284284
*/
285285
function renderElement(nomElement, doc, optDomElement) {
286286
if (!doc) {
287-
throw new IllegalOperationError('renderElement requires a reference to an HTML document.');
287+
throw new Error('renderElement requires a reference to an HTML document.');
288288
}
289289

290290
const ops = [];

test/render_element_test.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ describe('renderElement', () => {
1414
doc = win.document;
1515
});
1616

17-
1817
describe('creation', () => {
1918
it('creates simple element', () => {
2019
const domElement = renderElement(dom.div(), doc);
@@ -41,6 +40,11 @@ describe('renderElement', () => {
4140
assert.equal(domElement.outerHTML, '<input type="checkbox">');
4241
});
4342

43+
it('leaves attributes with a falsy zero', () => {
44+
const domElement = renderElement(dom.option({value: 0}), doc);
45+
assert.equal(domElement.outerHTML, '<option value="0"></option>');
46+
});
47+
4448
it('creates children', () => {
4549
const domElement = renderElement(dom.div(() => {
4650
dom.ul(() => {
@@ -106,6 +110,38 @@ describe('renderElement', () => {
106110
assert.equal(ul.childNodes[2].textContent, 'three');
107111
});
108112

113+
it('leaves zero value attributes after update', () => {
114+
let updater = null;
115+
let selectedIndex = 0;
116+
117+
const domElement = renderElement(dom.div(() => {
118+
dom.div((update) => {
119+
updater = update;
120+
dom.select(() => {
121+
dom.option({value: 0, selected: 0 === selectedIndex}, "aye");
122+
dom.option({value: 1, selected: 1 === selectedIndex}, "bee");
123+
dom.option({value: 2, selected: 2 === selectedIndex}, "cee");
124+
});
125+
});
126+
}), doc);
127+
128+
assert.equal(domElement.outerHTML, '<div><div><select>' +
129+
'<option value="0" selected="true">aye</option>' +
130+
'<option value="1">bee</option>' +
131+
'<option value="2">cee</option>' +
132+
'</select></div></div>');
133+
selectedIndex = 2;
134+
135+
updater();
136+
builder.forceUpdate();
137+
138+
assert.equal(domElement.outerHTML, '<div><div><select>' +
139+
'<option value="0">aye</option>' +
140+
'<option value="1">bee</option>' +
141+
'<option value="2" selected="true">cee</option>' +
142+
'</select></div></div>');
143+
});
144+
109145
it('assigns click handler', () => {
110146
const handler = sinon.spy();
111147
const element = renderElement(dom.button({onClick: handler}), doc);

0 commit comments

Comments
 (0)