Skip to content

Commit 83cce66

Browse files
author
Steve Orvell
committed
Merge pull request #2409 from Polymer/2408-multiple-linkPath
Allow multiple paths to be linked using linkPath. Fixes #2048
2 parents 573ca29 + bee110b commit 83cce66

File tree

3 files changed

+88
-16
lines changed

3 files changed

+88
-16
lines changed

src/standard/notify-path.html

+4-14
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@
278278
this._boundPaths[to] = from;
279279
// this.set(to, this.get(from));
280280
} else {
281-
this.unbindPath(to);
281+
this.unlinkPaths(to);
282282
// this.set(to, from);
283283
}
284284
},
@@ -299,23 +299,13 @@
299299
},
300300

301301
_notifyBoundPaths: function(path, value) {
302-
var from, to;
303302
for (var a in this._boundPaths) {
304303
var b = this._boundPaths[a];
305304
if (path.indexOf(a + '.') == 0) {
306-
from = a;
307-
to = b;
308-
break;
305+
this.notifyPath(this._fixPath(b, a, path), value);
306+
} else if (path.indexOf(b + '.') == 0) {
307+
this.notifyPath(this._fixPath(a, b, path), value);
309308
}
310-
if (path.indexOf(b + '.') == 0) {
311-
from = b;
312-
to = a;
313-
break;
314-
}
315-
}
316-
if (from && to) {
317-
var p = this._fixPath(to, from, path);
318-
this.notifyPath(p, value);
319309
}
320310
},
321311

test/unit/notify-path-elements.html

+8-2
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,10 @@
125125
'multiplePathsChanged(a, nested.b, nested.obj.c)',
126126
'arrayChanged(array.splices)',
127127
'arrayNoCollChanged(arrayNoColl.splices)',
128-
'arrayOrPropChanged(prop, array.splices)'
128+
'arrayOrPropChanged(prop, array.splices)',
129+
'aChanged(a.*)',
130+
'bChanged(b.*)',
131+
'cChanged(c.*)'
129132
],
130133
created: function() {
131134
this.observerCounts = {
@@ -219,7 +222,10 @@
219222
arrayOrPropChanged: function(prop, splices) {
220223
this.observerCounts.arrayOrPropChanged++;
221224
assert.equal(prop, this.prop);
222-
}
225+
},
226+
aChanged: function() {},
227+
bChanged: function() {},
228+
cChanged: function() {}
223229
});
224230
</script>
225231
</dom-module>

test/unit/notify-path.html

+76
Original file line numberDiff line numberDiff line change
@@ -1153,6 +1153,82 @@
11531153
assert.strictEqual(el.array[3], 'orig3');
11541154
});
11551155

1156+
test('link two objects', function() {
1157+
var aChanged = 0;
1158+
var bChanged = 0;
1159+
el.a = el.b = {};
1160+
el.linkPaths('b', 'a');
1161+
el.aChanged = function() { aChanged++; };
1162+
el.bChanged = function() { bChanged++; };
1163+
el.set('a.foo', 1);
1164+
assert.equal(aChanged, 1);
1165+
assert.equal(bChanged, 1);
1166+
el.unlinkPaths('b');
1167+
el.set('a.foo', 2);
1168+
assert.equal(aChanged, 2);
1169+
assert.equal(bChanged, 1);
1170+
});
1171+
1172+
test('link three objects', function() {
1173+
var aChanged = 0;
1174+
var bChanged = 0;
1175+
var cChanged = 0;
1176+
el.a = el.b = el.c = {};
1177+
el.linkPaths('b', 'a');
1178+
el.linkPaths('c', 'a');
1179+
el.aChanged = function() { aChanged++; };
1180+
el.bChanged = function() { bChanged++; };
1181+
el.cChanged = function() { cChanged++; };
1182+
el.set('a.foo', 1);
1183+
assert.equal(aChanged, 1);
1184+
assert.equal(bChanged, 1);
1185+
assert.equal(cChanged, 1);
1186+
el.unlinkPaths('b');
1187+
el.set('a.foo', 2);
1188+
assert.equal(aChanged, 2);
1189+
assert.equal(bChanged, 1);
1190+
assert.equal(cChanged, 2);
1191+
});
1192+
1193+
test('link two arrays', function() {
1194+
var aChanged = 0;
1195+
var bChanged = 0;
1196+
el.a = el.b = [];
1197+
el.linkPaths('b', 'a');
1198+
el.aChanged = function() { aChanged++; };
1199+
el.bChanged = function() { bChanged++; };
1200+
el.push('a', {});
1201+
// 2 changes for arrays (splices & length)
1202+
assert.equal(aChanged, 2);
1203+
assert.equal(bChanged, 2);
1204+
el.unlinkPaths('b');
1205+
el.push('a', {});
1206+
assert.equal(aChanged, 4);
1207+
assert.equal(bChanged, 2);
1208+
});
1209+
1210+
test('link three arrays', function() {
1211+
var aChanged = 0;
1212+
var bChanged = 0;
1213+
var cChanged = 0;
1214+
el.a = el.b = el.c = [];
1215+
el.linkPaths('b', 'a');
1216+
el.linkPaths('c', 'a');
1217+
el.aChanged = function() { aChanged++; };
1218+
el.bChanged = function() { bChanged++; };
1219+
el.cChanged = function() { cChanged++; };
1220+
el.push('a', {});
1221+
// 2 changes for arrays (splices & length)
1222+
assert.equal(aChanged, 2);
1223+
assert.equal(bChanged, 2);
1224+
assert.equal(cChanged, 2);
1225+
el.unlinkPaths('b');
1226+
el.push('a', {});
1227+
assert.equal(aChanged, 4);
1228+
assert.equal(bChanged, 2);
1229+
assert.equal(cChanged, 4);
1230+
});
1231+
11561232
});
11571233

11581234
</script>

0 commit comments

Comments
 (0)