diff --git a/README.md b/README.md index 8a146e4..34346b3 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Bind.bindTo(expr, toExpr) | Assign result of `expr` to `toExpr` (NB: if `expr` c Bind.notify(expr, oldValue, newValue) | Manually execute notification about property or method changes (if `expr` is method, then `oldValue` and `newValue` are not required) Bind.unbind(expr, listener) | Unsubscribe provided `listener` from `expr` changes (NB: if `listener` is not specified, all listeners for binded to this `expr` will be unsubscribed) Bind.bindAll(obj:IBindable, listener, force) | Bind all properties and methods of `obj` (force mode instantiate all lazy signals). Return unbind callback -Bind.unbindAll(obj:IBindable) | `listener:String->Void` Unbind all properties and methods of `obj` (NB: still can bind new listeners after that!) +Bind.unbindAll(obj:IBindable) | `listener(name:String, oldValue:Dynamic, newValue:Dynamic):Void` Unbind all properties and methods of `obj` (NB: still can bind new listeners after that!) ## Extended API: diff --git a/README_ru.md b/README_ru.md index 55d2da0..7826ef1 100644 --- a/README_ru.md +++ b/README_ru.md @@ -60,7 +60,7 @@ Bind.bind(expr, listener) | `listener` вызывается при смене с Bind.bindTo(expr, toExpr) | Присваивает значение `expr` выражению `toExpr` (NB: в случае метода вызывает метод без параметров!). Автоматически первый вызов НЕ происходит. Метод возвращает ссылку на функцию, позволяющую отписаться. Bind.notify(expr, oldValue, newValue) | Ручной вызов оповещения об изменении свойства или метода (в случае метода ожидается только один аргумент в методе `notiry`) Bind.unbind(expr, listener) | Удаляется подписка на изменения свойства (NB: если `listener` не указать, произойдет полная отписка всех слушателей!) -Bind.bindAll(obj:IBindable, listener, force) | `listener:String->Void` Подписывается на изменения всех свойств и методов `obj` (force режим создаст все лениво создаваемые сигналы). Вернет колбек для отписки +Bind.bindAll(obj:IBindable, listener, force) | `listener(name:String, oldValue:Dynamic, newValue:Dynamic):Void` Подписывается на изменения всех свойств и методов `obj` (force режим создаст все лениво создаваемые сигналы). Вернет колбек для отписки Bind.unbindAll(obj:IBindable) | Удаляются все подписки на изменения всех свойств и методов объекта (NB: дальнейшая подписка доступна!) ## Расширенное API: diff --git a/haxelib.json b/haxelib.json index 7c4be3e..2a4f2da 100644 --- a/haxelib.json +++ b/haxelib.json @@ -5,8 +5,8 @@ "tags": ["bind", "binding", "bindings", "cross"], "description": "Powerful and fast macro-based data binding engine inspired by Flex Bindings with easy-to-use syntax.", "classPath": "src", - "version": "2.5.0", - "releasenote": "extend bindAll method, major fixes", + "version": "2.5.1", + "releasenote": "bindAll method dispatch old and new properties value", "contributors": [ "deep" ] diff --git a/src/bindx/BindSignal.hx b/src/bindx/BindSignal.hx index 1994cf6..52a0880 100644 --- a/src/bindx/BindSignal.hx +++ b/src/bindx/BindSignal.hx @@ -95,18 +95,18 @@ class SignalTools { } } - static public function bindAll(bindable:bindx.IBindable, callback:String -> Void, force = true):Void -> Void { + static public function bindAll(bindable:bindx.IBindable, callback:String -> Dynamic -> Dynamic -> Void, force = true):Void -> Void { var listeners = new Map, Dynamic>(); var signals = getSignals(bindable, force); for (name in signals.keys()) { var signal = signals.get(name); if (std.Std.is(signal, FieldSignal)) { - var listener = function (_, _) callback(name); + var listener = function (from:Dynamic, to:Dynamic) callback(name, from, to); listeners.set(signal, listener); signal.add(listener); } else { - var listener = function () callback(name); + var listener = function () callback(name, null, null); listeners.set(signal, listener); signal.add(listener); } diff --git a/test/BaseTest.hx b/test/BaseTest.hx index 53f4c04..b5e1733 100644 --- a/test/BaseTest.hx +++ b/test/BaseTest.hx @@ -291,12 +291,25 @@ class BaseTest extends BuddySuite { it("bindx should bind all bindings (force mode)", function () { var fieldName = ""; - var unbind = Bind.bindAll(b, function (name) { name.should.be(fieldName); callNum ++; }, true); + var fromValue = b.str = b.str2 = "1"; + var unbind = Bind.bindAll(b, function (name, from:Dynamic, to:Dynamic) { + name.should.be(fieldName); + if (fromValue != null) + { + from.should.be(fromValue); + to.should.be(Reflect.getProperty(b, name)); + } else { + from.should.be(null); + to.should.be(null); + } + callNum ++; + }, true); fieldName = "str"; b.str = "123"; fieldName = "str2"; b.str2 = "123"; + fromValue = null; fieldName = "bind"; Bind.notify(b.bind); fieldName = "bind2"; @@ -316,11 +329,24 @@ class BaseTest extends BuddySuite { it("bindx should bind all bindings (simple mode)", function () { var fieldName = ""; - var unbind = Bind.bindAll(b, function (name) { name.should.be(fieldName); callNum ++; }, false); + var fromValue = b.str = b.str2 = "1"; + var unbind = Bind.bindAll(b, function (name, from:Dynamic, to:Dynamic) { + name.should.be(fieldName); + if (fromValue != null) + { + from.should.be(fromValue); + to.should.be(Reflect.getProperty(b, name)); + } else { + from.should.be(null); + to.should.be(null); + } + callNum ++; + }, false); b.str = "123"; fieldName = "str2"; b.str2 = "123"; + fromValue = null; Bind.notify(b.bind); fieldName = "bind2"; Bind.notify(b.bind2);