Skip to content

Commit 3b030b3

Browse files
committed
fix: Allow to move sandbox between arrays with existence binder
1 parent 35b403f commit 3b030b3

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

src/array/_processrendering/renderitemnode.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export default function renderItemNode({
5858
// moving sandbox does not fire "render" event but it fire "afterrender"
5959
// since "afterrender" means "node is inserted to DOM"
6060
return {
61-
node,
61+
node: node.__matreshkaReplacedByNode || node,
6262
itemEventOptions: {
6363
node,
6464
self: item,
@@ -106,8 +106,8 @@ export default function renderItemNode({
106106
throw matreshkaError('array:rendered_number_nodes', { length: parsed.length });
107107
}
108108

109-
let node = renderedInArrays[selfId] = parsed[0];
110-
node = node.__matreshkaReplacedByNode || node;
109+
const node = renderedInArrays[selfId] = parsed[0];
110+
111111

112112
if (bindRenderedAsSandbox) {
113113
if (forceRerender) {
@@ -137,8 +137,8 @@ export default function renderItemNode({
137137

138138
triggerOne(item, 'render', itemEventOptions);
139139

140-
return { node, itemEventOptions };
140+
return { node: node.__matreshkaReplacedByNode || node, itemEventOptions };
141141
}
142142

143-
return { node };
143+
return { node: node.__matreshkaReplacedByNode || node };
144144
}

test/spec/bindings/existence_binder_spec.js

+39
Original file line numberDiff line numberDiff line change
@@ -137,4 +137,43 @@ describe('Existence binder', () => {
137137
Array.from(arr.nodes.sandbox.childNodes).map(({ nodeName }) => nodeName)
138138
).toEqual(['#comment', 'DIV', 'DIV', '#comment', 'DIV']);
139139
});
140+
141+
it('allows to move sandbox across arrays', () => {
142+
class Arr extends MatreshkaArray {
143+
constructor(...args) {
144+
super(...args)
145+
.bindNode('sandbox', '<div data-foo="bar"></div>');
146+
}
147+
}
148+
149+
const arr = new Arr();
150+
const arr2 = new Arr();
151+
const obj = { exists: true }; // eslint-disable-line no-shadow
152+
arr.itemRenderer = arr2.itemRenderer = '<div><span></span></div>';
153+
154+
arr.push(obj);
155+
const arrItemNode = arr.nodes.sandbox.childNodes[0];
156+
expect(arrItemNode.nodeName).toEqual('DIV');
157+
158+
bindNode(obj, 'exists', ':sandbox', existence(), noDebounceFlag);
159+
obj.exists = false;
160+
161+
const replacedBy = arr.nodes.sandbox.childNodes[0];
162+
163+
expect(replacedBy.nodeName).toEqual('#comment');
164+
165+
arr2.push_(obj, {
166+
moveSandbox: true
167+
});
168+
169+
expect(
170+
arr2.nodes.sandbox.childNodes[0]
171+
).toEqual(replacedBy);
172+
173+
obj.exists = true;
174+
175+
expect(
176+
arr2.nodes.sandbox.childNodes[0]
177+
).toEqual(arrItemNode);
178+
});
140179
});

0 commit comments

Comments
 (0)