bindAll with property values

This commit is contained in:
Dima Granetchi
2015-08-02 23:19:54 +03:00
parent 61c7b56435
commit 83e7d14588
5 changed files with 35 additions and 9 deletions
+1 -1
View File
@@ -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.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.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.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: ## Extended API:
+1 -1
View File
@@ -60,7 +60,7 @@ Bind.bind(expr, listener) | `listener` вызывается при смене с
Bind.bindTo(expr, toExpr) | Присваивает значение `expr` выражению `toExpr` (NB: в случае метода вызывает метод без параметров!). Автоматически первый вызов НЕ происходит. Метод возвращает ссылку на функцию, позволяющую отписаться. Bind.bindTo(expr, toExpr) | Присваивает значение `expr` выражению `toExpr` (NB: в случае метода вызывает метод без параметров!). Автоматически первый вызов НЕ происходит. Метод возвращает ссылку на функцию, позволяющую отписаться.
Bind.notify(expr, oldValue, newValue) | Ручной вызов оповещения об изменении свойства или метода (в случае метода ожидается только один аргумент в методе `notiry`) Bind.notify(expr, oldValue, newValue) | Ручной вызов оповещения об изменении свойства или метода (в случае метода ожидается только один аргумент в методе `notiry`)
Bind.unbind(expr, listener) | Удаляется подписка на изменения свойства (NB: если `listener` не указать, произойдет полная отписка всех слушателей!) 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: дальнейшая подписка доступна!) Bind.unbindAll(obj:IBindable) | Удаляются все подписки на изменения всех свойств и методов объекта (NB: дальнейшая подписка доступна!)
## Расширенное API: ## Расширенное API:
+2 -2
View File
@@ -5,8 +5,8 @@
"tags": ["bind", "binding", "bindings", "cross"], "tags": ["bind", "binding", "bindings", "cross"],
"description": "Powerful and fast macro-based data binding engine inspired by Flex Bindings with easy-to-use syntax.", "description": "Powerful and fast macro-based data binding engine inspired by Flex Bindings with easy-to-use syntax.",
"classPath": "src", "classPath": "src",
"version": "2.5.0", "version": "2.5.1",
"releasenote": "extend bindAll method, major fixes", "releasenote": "bindAll method dispatch old and new properties value",
"contributors": [ "contributors": [
"deep" "deep"
] ]
+3 -3
View File
@@ -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<bindx.BindSignal.Signal<Dynamic>, Dynamic>(); var listeners = new Map<bindx.BindSignal.Signal<Dynamic>, Dynamic>();
var signals = getSignals(bindable, force); var signals = getSignals(bindable, force);
for (name in signals.keys()) { for (name in signals.keys()) {
var signal = signals.get(name); var signal = signals.get(name);
if (std.Std.is(signal, FieldSignal)) { 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); listeners.set(signal, listener);
signal.add(listener); signal.add(listener);
} else { } else {
var listener = function () callback(name); var listener = function () callback(name, null, null);
listeners.set(signal, listener); listeners.set(signal, listener);
signal.add(listener); signal.add(listener);
} }
+28 -2
View File
@@ -291,12 +291,25 @@ class BaseTest extends BuddySuite {
it("bindx should bind all bindings (force mode)", function () { it("bindx should bind all bindings (force mode)", function () {
var fieldName = ""; 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"; fieldName = "str";
b.str = "123"; b.str = "123";
fieldName = "str2"; fieldName = "str2";
b.str2 = "123"; b.str2 = "123";
fromValue = null;
fieldName = "bind"; fieldName = "bind";
Bind.notify(b.bind); Bind.notify(b.bind);
fieldName = "bind2"; fieldName = "bind2";
@@ -316,11 +329,24 @@ class BaseTest extends BuddySuite {
it("bindx should bind all bindings (simple mode)", function () { it("bindx should bind all bindings (simple mode)", function () {
var fieldName = ""; 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"; b.str = "123";
fieldName = "str2"; fieldName = "str2";
b.str2 = "123"; b.str2 = "123";
fromValue = null;
Bind.notify(b.bind); Bind.notify(b.bind);
fieldName = "bind2"; fieldName = "bind2";
Bind.notify(b.bind2); Bind.notify(b.bind2);