diff --git a/src/bindx/BindxExt.hx b/src/bindx/BindxExt.hx index d9f7132..b3759ad 100644 --- a/src/bindx/BindxExt.hx +++ b/src/bindx/BindxExt.hx @@ -241,6 +241,9 @@ class BindExt { var value = '${prefix}value${i+1}'; var valueExpr = macro $i { value }; + var oldValue = '${prefix}oldValue${i+1}'; + var oldValueExpr = macro $i { oldValue }; + var fieldName = prev.field.name; var e = prev.e; @@ -253,7 +256,7 @@ class BindExt { var fn = prev.field.name; res.expr = macro @:pos(prev.e.pos) ${prev.e}.$fn; } - + if (prev.bindable) { var unbind = BindMacros.bindingSignalProvider.getClassFieldUnbindExpr(valueExpr, prev.field, prevListenerNameExpr ); @@ -266,11 +269,15 @@ class BindExt { $ { BindMacros.bindingSignalProvider.getClassFieldBindExpr(macro n, prev.field, prevListenerNameExpr ) }); } var callPrev = macro $prevListenerNameExpr($a { prev.params != null ? [] : [macro o != null ? o.$fieldName : null, macro n != null ? n.$fieldName : null] } ); + //fieldListenerBody.push(macro trace(Std.string(o) + " -> " + Std.string(n))); fieldListenerBody.push(callPrev); if (field.params != null) { - fieldListenerBody.unshift(macro var n:Null<$type> = try $e catch (e:Dynamic) null ); - fieldListenerBody.unshift(macro var o:Null<$type> = null ); + fieldListenerBody.unshift(macro var n:Null<$type> = $i{oldValue} = try $e catch (e:Dynamic) null ); + fieldListenerBody.unshift(macro var o:Null<$type> = $i{oldValue} ); + + res.init.push(macro var $oldValue:Null<$type> = null); + res.unbind.push(macro $oldValueExpr = null); fieldListener = macro function $listenerName ():Void $b { fieldListenerBody }; } else { diff --git a/test/ChainBindTest.hx b/test/ChainBindTest.hx index 7fa72fe..54dbd3f 100644 --- a/test/ChainBindTest.hx +++ b/test/ChainBindTest.hx @@ -14,11 +14,13 @@ class ChainBindTest extends BuddySuite { describe("Using BindExt.chain", { + var from:String; var val:String; var b:BindableChain; var callNum:Int; before({ + from = null; val = "a"; b = new BindableChain(4); callNum = 0; @@ -27,8 +29,10 @@ class ChainBindTest extends BuddySuite { it("BindExt.chain should bind chain changes (unset links)", { b.c.c.d = val; - var listener = function (_, t:String) { + var listener = function (f:String, t:String) { callNum++; + f.should.be(from); + from = val; t.should.be(val); }; var unbind = BindExt.chain(b.c.c.d, listener); @@ -37,6 +41,7 @@ class ChainBindTest extends BuddySuite { val = null; b.c = null; + callNum.should.be(2); b.c = new BindableChain(2); @@ -54,8 +59,10 @@ class ChainBindTest extends BuddySuite { b.c = null; val = null; - var unbind = BindExt.chain(b.c.c.d, function (_, t:String) { + var unbind = BindExt.chain(b.c.c.d, function (f:String, t:String) { callNum++; + f.should.be(from); + from = val; t.should.be(val); }); @@ -72,9 +79,11 @@ class ChainBindTest extends BuddySuite { var b2 = new BindableChain(4); b.c.c.f("tada").d = val; b2.c.c.f("tada").d = val; - var unbind = BindExt.chain(b.c.c.f("tada").d, function (_, t:String) { - callNum++; + var unbind = BindExt.chain(b.c.c.f("tada").d, function (f:String, t:String) { + f.should.be(from); + from = val; t.should.be(val); + callNum++; }); callNum.should.be(1); // first auto call