aurelia-cycle
Advanced tools
Comparing version 0.0.6 to 0.1.0
declare module 'aurelia-cycle' { | ||
import { Observable } from 'rxjs/Rx'; | ||
export function configure(frameworkConfig: any): void; | ||
export type PropertyViewSetterMap = Map<string, (value) => void>; | ||
export type ViewObservable = Observable<string | number>; | ||
export type FromViewActionObservable = Observable<Action> & { | ||
_aureliaType: 'action' | 'property'; | ||
import { FrameworkConfiguration } from 'aurelia-framework'; | ||
export function configure(frameworkConfig: FrameworkConfiguration): void; | ||
export type Action = { | ||
event: AnyEvent; | ||
arguments: Array<any>; | ||
}; | ||
export type FromViewValueObservable = ViewObservable & { | ||
_aureliaType: 'action' | 'property'; | ||
export type Value = string | number; | ||
export type ViewValue = Action | Value; | ||
export type ObservableTypeExtension = { | ||
_cycleType: 'action' | 'value'; | ||
}; | ||
export type FromViewObservable = FromViewActionObservable | FromViewValueObservable; | ||
export type FromViewObservableMap = Map<string, FromViewObservable>; | ||
export type ActionObservable = Observable<Action> & ObservableTypeExtension; | ||
export type ValueObservable = Observable<Value> & ObservableTypeExtension; | ||
export type ViewObservable = (Observable<Action> | Observable<Value>) & ObservableTypeExtension; | ||
export type ViewObservableMap = Map<string, ViewObservable>; | ||
export type ViewValues = Map<string, string | number>; | ||
export type AnyEvent = Event | FocusEvent | GamepadEvent | HashChangeEvent | KeyboardEvent | MessageEvent | MouseEvent | MouseWheelEvent | MSGestureEvent | MSManipulationEvent | MSMediaKeyMessageEvent | MSMediaKeyNeededEvent | MSSiteModeEvent | MutationEvent | NavigationCompletedEvent | NavigationEvent | NavigationEventWithReferrer | OfflineAudioCompletionEvent | PageTransitionEvent | PermissionRequestedEvent | PointerEvent | PopStateEvent | ProgressEvent | ScriptNotifyEvent | StorageEvent | SVGZoomEvent | TextEvent | TouchEvent | TrackEvent | TransitionEvent | UIEvent | UnviewableContentIdentifiedEvent | WebGLContextEvent | WheelEvent; | ||
export type Action = { | ||
event: AnyEvent; | ||
arguments: Array<any>; | ||
}; | ||
export type ViewSource = { | ||
values: (bindingName: string) => FromViewValueObservable; | ||
actions: (bindingName: string) => FromViewActionObservable; | ||
values: (bindingName: string) => ValueObservable; | ||
actions: (bindingName: string) => ActionObservable; | ||
}; | ||
export function makeAureliaDriver(context: any): any; | ||
export class CycleBindingBehavior { | ||
bind(binding: any, scope: any, name: any): void; | ||
unbind(binding: any, scope: any): void; | ||
} | ||
export function cycle(potentialTarget?: any): any; | ||
} |
import { Observable } from 'rxjs/Rx'; | ||
export declare function configure(frameworkConfig: any): void; | ||
export declare type PropertyViewSetterMap = Map<string, (value) => void>; | ||
export declare type ViewObservable = Observable<string | number>; | ||
export declare type FromViewActionObservable = Observable<Action> & { | ||
_aureliaType: 'action' | 'property'; | ||
import { FrameworkConfiguration } from 'aurelia-framework'; | ||
export declare function configure(frameworkConfig: FrameworkConfiguration): void; | ||
export declare type Action = { | ||
event: AnyEvent; | ||
arguments: Array<any>; | ||
}; | ||
export declare type FromViewValueObservable = ViewObservable & { | ||
_aureliaType: 'action' | 'property'; | ||
export declare type Value = string | number; | ||
export declare type ViewValue = Action | Value; | ||
export declare type ObservableTypeExtension = { | ||
_cycleType: 'action' | 'value'; | ||
}; | ||
export declare type FromViewObservable = FromViewActionObservable | FromViewValueObservable; | ||
export declare type FromViewObservableMap = Map<string, FromViewObservable>; | ||
export declare type ActionObservable = Observable<Action> & ObservableTypeExtension; | ||
export declare type ValueObservable = Observable<Value> & ObservableTypeExtension; | ||
export declare type ViewObservable = (Observable<Action> | Observable<Value>) & ObservableTypeExtension; | ||
export declare type ViewObservableMap = Map<string, ViewObservable>; | ||
export declare type ViewValues = Map<string, string | number>; | ||
export declare type AnyEvent = Event | FocusEvent | GamepadEvent | HashChangeEvent | KeyboardEvent | MessageEvent | MouseEvent | MouseWheelEvent | MSGestureEvent | MSManipulationEvent | MSMediaKeyMessageEvent | MSMediaKeyNeededEvent | MSSiteModeEvent | MutationEvent | NavigationCompletedEvent | NavigationEvent | NavigationEventWithReferrer | OfflineAudioCompletionEvent | PageTransitionEvent | PermissionRequestedEvent | PointerEvent | PopStateEvent | ProgressEvent | ScriptNotifyEvent | StorageEvent | SVGZoomEvent | TextEvent | TouchEvent | TrackEvent | TransitionEvent | UIEvent | UnviewableContentIdentifiedEvent | WebGLContextEvent | WheelEvent; | ||
export declare type Action = { | ||
event: AnyEvent; | ||
arguments: Array<any>; | ||
}; | ||
export declare type ViewSource = { | ||
values: (bindingName: string) => FromViewValueObservable; | ||
actions: (bindingName: string) => FromViewActionObservable; | ||
values: (bindingName: string) => ValueObservable; | ||
actions: (bindingName: string) => ActionObservable; | ||
}; | ||
export declare function makeAureliaDriver(context: any): any; | ||
export declare class CycleBindingBehavior { | ||
bind(binding: any, scope: any, name: any): void; | ||
unbind(binding: any, scope: any): void; | ||
} | ||
export declare function cycle(potentialTarget?: any): any; |
@@ -1,7 +0,5 @@ | ||
define(["require", "exports", 'aurelia-templating', 'rxjs/Rx', '@cycle/core/lib/index', '@cycle/rxjs-adapter/lib/index', 'aurelia-logging'], function (require, exports, aurelia_templating_1, Rx_1, index_1, index_2, TheLogManager) { | ||
define(["require", "exports", 'aurelia-binding', 'aurelia-templating', 'rxjs/Rx', '@cycle/core/lib/index', '@cycle/rxjs-adapter/lib/index', 'aurelia-framework'], function (require, exports, aurelia_binding_1, aurelia_templating_1, Rx_1, index_1, index_2, aurelia_framework_1) { | ||
"use strict"; | ||
var logger = TheLogManager.getLogger('aurelia-cycle'); | ||
var logger = aurelia_framework_1.LogManager.getLogger('aurelia-cycle-new'); | ||
function configure(frameworkConfig) { | ||
var bindingBehaviorInstance = frameworkConfig.container.get(CycleBindingBehavior); | ||
frameworkConfig.aurelia.resources.registerBindingBehavior('cycle', bindingBehaviorInstance); | ||
var originalBind = aurelia_templating_1.View.prototype.bind; | ||
@@ -30,23 +28,106 @@ aurelia_templating_1.View.prototype.bind = function bind(context, overrideContext, _systemUpdate) { | ||
}; | ||
var callScopeConnect = aurelia_binding_1.CallScope.prototype.connect; | ||
aurelia_binding_1.CallScope.prototype.connect = function connect(binding, scope) { | ||
callScopeConnect.apply(this, arguments); | ||
console.log('connected', binding, scope, this); | ||
if (this.name == 'cycleValue') { | ||
console.log('we have a cycleValue connect!'); | ||
var context = scope.bindingContext; | ||
var name_1 = this.args[0].evaluate(scope, binding.lookupFunctions, true); | ||
var observable = getOrCreateObservable(name_1, context); | ||
observable.subscribe(function (value) { | ||
var bindingValue = binding.sourceExpression.evaluate(binding.source, binding.lookupFunctions); | ||
binding.updateTarget(bindingValue); | ||
}, function (error) { return logger.error("binding error for " + name_1, error); }, function () { return logger.debug("observable for " + name_1 + " complete"); }); | ||
} | ||
}; | ||
var callScopeConstructor = aurelia_binding_1.CallScope.prototype.constructor; | ||
aurelia_binding_1.CallScope.prototype.constructor = function () { | ||
callScopeConstructor.apply(this, arguments); | ||
this.isAssignable = true; | ||
}; | ||
function triggerObservers(name, value, context) { | ||
var observers = context.observers.get(name); | ||
if (observers) | ||
observers.forEach(function (observer) { return observer.next(value); }); | ||
else | ||
logger.error("no observer set exists for " + name + " cycle binding"); | ||
} | ||
aurelia_binding_1.CallScope.prototype.assign = function assign(scope, value, lookupFunctions) { | ||
var context = aurelia_binding_1.getContextFor(this.name, scope, this.ancestor); | ||
if (!context || typeof context.cycle != 'function' || this.name !== 'cycleValue' || this.args.length === 0) { | ||
throw new Error("Binding expression \"" + this + "\" cannot be assigned to."); | ||
} | ||
var name = this.args[0].evaluate(scope, lookupFunctions, true); | ||
logger.debug(context, 'will set', name, 'to', value); | ||
triggerObservers(name, value, context); | ||
}; | ||
var callScopeEvaluate = aurelia_binding_1.CallScope.prototype.evaluate; | ||
aurelia_binding_1.CallScope.prototype.evaluate = function evaluate(scope, lookupFunctions, mustEvaluate) { | ||
var context = aurelia_binding_1.getContextFor(this.name, scope, this.ancestor); | ||
if (!context || typeof context.cycle != 'function' || (this.name !== 'cycleValue' && this.name !== 'cycleAction') || this.args.length === 0) { | ||
return callScopeEvaluate.apply(this, arguments); | ||
} | ||
var name = this.args[0].evaluate(scope, lookupFunctions, true); | ||
if (this.name === 'cycleAction') { | ||
var args = evalList(scope, Array.from(this.args).slice(1), lookupFunctions); | ||
var event_1 = scope.overrideContext.$event; | ||
logger.debug(context, 'event trigerred', name, args, event_1, this); | ||
triggerObservers(name, { event: event_1, arguments: args }, context); | ||
return; | ||
} | ||
logger.debug(context, 'getting value to set in the view', name, this); | ||
if (name in context) | ||
return context[name]; | ||
}; | ||
function getOrCreateObservable(name, context, hasValue) { | ||
if (hasValue === void 0) { hasValue = true; } | ||
var observable = context.observables.get(name); | ||
if (!observable) { | ||
var observers_1 = new Set(); | ||
observable = Rx_1.Observable.create(function (observer) { | ||
observers_1.add(observer); | ||
return function () { | ||
observers_1.delete(observer); | ||
}; | ||
}); | ||
if (hasValue) { | ||
observable._cycleType = 'value'; | ||
var storeValueCacheSubscription = observable.subscribe(function (value) { return context[name] = value; }); | ||
} | ||
else { | ||
observable._cycleType = 'action'; | ||
} | ||
context.observables.set(name, observable); | ||
context.observers.set(name, observers_1); | ||
} | ||
return observable; | ||
} | ||
aurelia_binding_1.CallScope.prototype.bind = function bind(binding, scope, lookupFunctions) { | ||
var expression = binding.sourceExpression; | ||
if (expression.name == 'cycleValue' || expression.name == 'cycleAction') { | ||
var context = aurelia_binding_1.getContextFor(expression.name, scope, expression.ancestor); | ||
var name_2 = expression.args[0].evaluate(scope, lookupFunctions, true); | ||
logger.debug('store the updateTarget for', name_2, context, binding); | ||
var observable = getOrCreateObservable(name_2, context, expression.name == 'cycleValue'); | ||
} | ||
}; | ||
aurelia_binding_1.CallScope.prototype.unbind = function unbind(binding, scope) { | ||
var expression = binding.sourceExpression; | ||
if (expression.name == 'cycleValue') { | ||
expression._unbind(); | ||
} | ||
}; | ||
} | ||
exports.configure = configure; | ||
function invokeAureliaBindingSetter(context, name, value) { | ||
var previousValue = context.aureliaViewValues.get(name); | ||
var previousValue = context[name]; | ||
if (previousValue !== value) { | ||
var propertyViewSetters = context.propertyViewSetters; | ||
var setter = propertyViewSetters.get(name); | ||
if (setter) | ||
setter(value); | ||
else | ||
logger.error("the binding (" + name + ") is not a two-way binding and you cannot set it!"); | ||
var observers = context.observers; | ||
observers.get(name).forEach(function (observer) { return observer.next(value); }); | ||
} | ||
} | ||
function getAureliaObservableForBinding(context, name) { | ||
var aureliaFromViewObservables = context.aureliaFromViewObservables; | ||
var aureliaToViewObservables = context.aureliaToViewObservables; | ||
var fromView = aureliaFromViewObservables.get(name); | ||
var toView = aureliaToViewObservables.get(name); | ||
var returnObservable = toView && fromView ? Rx_1.Observable.merge(fromView, toView) : toView || fromView; | ||
returnObservable._aureliaType = fromView ? fromView._aureliaType : 'property'; | ||
return returnObservable; | ||
var observables = context.observables; | ||
return observables.get(name); | ||
} | ||
@@ -64,4 +145,4 @@ function makeAureliaDriver(context) { | ||
var observable = getAureliaObservableForBinding(context, bindingName); | ||
if (!observable || observable._aureliaType != 'property') | ||
throw new Error("Cannot select an unexistent binding " + bindingName); | ||
if (!observable || observable._cycleType != 'value') | ||
throw new Error("Cannot select a non-existent value binding " + bindingName); | ||
return observable; | ||
@@ -71,4 +152,4 @@ }, | ||
var observable = getAureliaObservableForBinding(context, bindingName); | ||
if (!observable || observable._aureliaType != 'action') | ||
throw new Error("Cannot select an unexistent binding " + bindingName); | ||
if (!observable || observable._cycleType != 'action') | ||
throw new Error("Cannot select a non-existent action binding " + bindingName); | ||
return observable; | ||
@@ -80,10 +161,6 @@ }, | ||
driverCreator.streamAdapter = index_2.default; | ||
if (!context.propertyViewSetters) | ||
context.propertyViewSetters = new Map(); | ||
if (!context.aureliaFromViewObservables) | ||
context.aureliaFromViewObservables = new Map(); | ||
if (!context.aureliaToViewObservables) | ||
context.aureliaToViewObservables = new Map(); | ||
if (!context.aureliaViewValues) | ||
context.aureliaViewValues = new Map(); | ||
if (!context.observables) | ||
context.observables = new Map(); | ||
if (!context.observers) | ||
context.observers = new Map(); | ||
if (!context.cycleStarted || !context.cycleStartedResolve) | ||
@@ -94,129 +171,16 @@ context.cycleStarted = new Promise(function (resolve) { return context.cycleStartedResolve = resolve; }); | ||
exports.makeAureliaDriver = makeAureliaDriver; | ||
var interceptMethods = ['updateTarget', 'updateSource', 'callSource']; | ||
var CycleBindingBehavior = (function () { | ||
function CycleBindingBehavior() { | ||
var evalListCache = [[], [0], [0, 0], [0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0]]; | ||
function evalList(scope, list, lookupFunctions) { | ||
var length = list.length, cacheLength, i; | ||
for (cacheLength = evalListCache.length; cacheLength <= length; ++cacheLength) { | ||
evalListCache.push([]); | ||
} | ||
CycleBindingBehavior.prototype.bind = function (binding, scope, name) { | ||
var context = scope.overrideContext.bindingContext; | ||
var expression = binding.sourceExpression.expression; | ||
var firstExpression = expression.expression || expression; | ||
if (!name) { | ||
var maxNesting = 10; | ||
while (!firstExpression.name && maxNesting--) { | ||
firstExpression = firstExpression.left; | ||
} | ||
name = firstExpression.name; | ||
} | ||
logger.debug("Creating Cycle binding for '" + name + "' via interception"); | ||
var toViewObservers = new Set(); | ||
var toViewObservable = Rx_1.Observable.create(function (observer) { | ||
toViewObservers.add(observer); | ||
return function () { | ||
toViewObservers.delete(observer); | ||
}; | ||
}); | ||
binding.toViewObservable = toViewObservable; | ||
binding.toViewObservers = toViewObservers; | ||
context.aureliaToViewObservables.set(name, toViewObservable); | ||
var toViewSubscription; | ||
if (binding['updateTarget']) { | ||
var method = 'updateTarget'; | ||
binding[("cycle-intercepted-" + method)] = binding[method]; | ||
var updateBindingValueInView_1 = binding[method].bind(binding); | ||
toViewSubscription = toViewObservable.subscribe(function (value) { | ||
updateBindingValueInView_1(value); | ||
}, function (error) { return logger.error("Error in a toViewObservable binding for " + name); }); | ||
var toViewObserversNextAll_1 = function (value) { | ||
toViewObservers.forEach(function (observer) { return observer.next(value); }); | ||
}; | ||
binding[method] = function (value) { | ||
context.cycleStarted.then(function () { | ||
if (value !== undefined) { | ||
logger.debug("an initial value was seeded to the observable: " + name + " = '" + value + "'"); | ||
toViewObserversNextAll_1(value); | ||
} | ||
}); | ||
}; | ||
context.propertyViewSetters.set(name, toViewObserversNextAll_1); | ||
} | ||
var allChanges = toViewObservable; | ||
if (binding['updateSource'] || binding['callSource']) { | ||
var fromViewObservers_1 = new Set(); | ||
var fromViewObservable = Rx_1.Observable.create(function (observer) { | ||
fromViewObservers_1.add(observer); | ||
return function () { | ||
fromViewObservers_1.delete(observer); | ||
}; | ||
}); | ||
binding.fromViewObservable = fromViewObservable; | ||
binding.fromViewObservers = fromViewObservers_1; | ||
context.aureliaFromViewObservables.set(name, fromViewObservable); | ||
if (binding['updateSource']) { | ||
var method = 'updateSource'; | ||
binding[("cycle-intercepted-" + method)] = binding[method]; | ||
binding[method] = function (value) { | ||
fromViewObservers_1.forEach(function (observer) { return observer.next(value); }); | ||
}; | ||
fromViewObservable['_aureliaType'] = 'property'; | ||
allChanges = Rx_1.Observable.merge(fromViewObservable, toViewObservable); | ||
} | ||
if (binding['callSource']) { | ||
var method = 'callSource'; | ||
binding[("cycle-intercepted-" + method)] = binding[method]; | ||
var args_1 = firstExpression.args; | ||
binding[method] = function ($event) { | ||
var evaluatedArgs = []; | ||
for (var _i = 0, args_2 = args_1; _i < args_2.length; _i++) { | ||
var arg = args_2[_i]; | ||
evaluatedArgs.push(arg.evaluate(binding.source, binding.lookupFunctions, true)); | ||
} | ||
fromViewObservers_1.forEach(function (observer) { return observer.next({ event: event, arguments: evaluatedArgs }); }); | ||
}; | ||
fromViewObservable['_aureliaType'] = 'action'; | ||
} | ||
} | ||
if (binding['updateSource'] || binding['updateTarget']) { | ||
binding.allChangesObservable = | ||
allChanges.subscribe(function (value) { | ||
context.aureliaViewValues.set(name, value); | ||
}, function (error) { return logger.error(error.message); }, function () { | ||
logger.debug("completed allChangesObservable for " + name); | ||
binding.allChangesObservable = undefined; | ||
}); | ||
} | ||
}; | ||
CycleBindingBehavior.prototype.unbind = function (binding, scope) { | ||
var i = interceptMethods.length; | ||
while (i--) { | ||
var method = interceptMethods[i]; | ||
if (!binding[method]) { | ||
continue; | ||
} | ||
binding[method] = binding[("cycle-intercepted-" + method)]; | ||
binding[("cycle-intercepted-" + method)] = undefined; | ||
} | ||
if (binding.toViewObservable) { | ||
binding.toViewObservers.forEach(function (observer) { return observer.complete(); }); | ||
binding.toViewObservers = undefined; | ||
binding.toViewObservable = undefined; | ||
} | ||
if (binding.fromViewObservable) { | ||
binding.fromViewObservers.forEach(function (observer) { return observer.complete(); }); | ||
binding.fromViewObservers = undefined; | ||
binding.fromViewObservable = undefined; | ||
} | ||
}; | ||
return CycleBindingBehavior; | ||
}()); | ||
exports.CycleBindingBehavior = CycleBindingBehavior; | ||
function cycle(potentialTarget) { | ||
var deco = function (target) { | ||
console.log('cycle decorator', target); | ||
target.useCycle = true; | ||
}; | ||
return potentialTarget ? deco(potentialTarget) : deco; | ||
var result = evalListCache[length]; | ||
for (i = 0; i < length; ++i) { | ||
result[i] = list[i].evaluate(scope, lookupFunctions); | ||
} | ||
return result; | ||
} | ||
exports.cycle = cycle; | ||
}); | ||
//# sourceMappingURL=index.js.map | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8iLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0lBV0EsSUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUV2RCxtQkFBMEIsZUFBZTtRQUN2QyxJQUFNLHVCQUF1QixHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFDbkYsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDLENBQUE7UUFFM0YsSUFBTSxZQUFZLEdBQWlCLHlCQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQTtRQUV0RCx5QkFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsY0FBYyxPQUFZLEVBQUUsZUFBd0IsRUFBRSxhQUF1QjtZQUNqRyxJQUFJLE9BQU8sQ0FBQTtZQUVYLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDbEQ7b0JBQ0UsTUFBTSxDQUFDLFVBQUUsR0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBRSxDQUFBOztnQkFDNUUsQ0FBQztnQkFHRCxPQUFPLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQTtnQkFHOUIsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sT0FBTyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQzFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUM7d0JBQ2xELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFF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 | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8iLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0lBdUJBLElBQU0sTUFBTSxHQUFHLDhCQUFVLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUFHeEQsbUJBQTBCLGVBQXVDO1FBVS9ELElBQU0sWUFBWSxHQUFpQix5QkFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUE7UUFFdEQseUJBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLGNBQWMsT0FBWSxFQUFFLGVBQXdCLEVBQUUsYUFBdUI7WUFDakcsSUFBSSxPQUFPLENBQUE7WUFFWCxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xEO29CQUNFLE1BQU0sQ0FBQyxVQUFFLEdBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUUsQ0FBQTs7Z0JBQzVFLENBQUM7Z0JBR0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUE7Z0JBRzlCLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUMxQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDO3dCQUNsRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUE7Z0JBRS9DLENBQUM7Z0JBQUMsSUFBSSxDQUFDLENBQUM7b0JBRU4sT0FBTyxHQUFHLGlCQUFpQixFQUFFLENBQUE7Z0JBQy9CLENBQUM7WUFDSCxDQUFDO1lBRUQsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxD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 |
{ | ||
"name": "aurelia-cycle", | ||
"version": "0.0.6", | ||
"version": "0.1.0", | ||
"description": "An Aurelia plugin that enables the use of Cycle.js inside of Aurelia.", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -54,9 +54,9 @@ # aurelia-cycle | ||
To make bindings visible to the driver you need to apply the `cycle` Binding Behavior to them as shown below: | ||
To make bindings visible to the driver you need to refer to them as if they're either `cycleValue('yourName')` or `cycleAction('yourName')` as shown below: | ||
```html | ||
<template> | ||
<h2>${count & cycle}</h2> | ||
<button click.delegate="increment() & cycle">+</button> | ||
<button click.delegate="decrement() & cycle">-</button> | ||
<h2>${cycleValue('count')}</h2> | ||
<button click.delegate="cycleAction('increment')">+</button> | ||
<button click.delegate="cycleAction('decrement')">-</button> | ||
</template> | ||
@@ -63,0 +63,0 @@ ``` |
494
src/index.ts
@@ -1,2 +0,3 @@ | ||
import {View} from 'aurelia-templating'; | ||
import {CallScope, Scope, getContextFor, Binding, Expression} from 'aurelia-binding' | ||
import {View} from 'aurelia-templating' | ||
import {Observable, Observer, Subscription} from 'rxjs/Rx' | ||
@@ -6,14 +7,32 @@ import Cycle from '@cycle/core/lib/index' | ||
import { DriverFunction } from '@cycle/base' | ||
import {Aurelia, LogManager, FrameworkConfiguration} from 'aurelia-framework'; | ||
import * as TheLogManager from 'aurelia-logging' | ||
// for returning data to other cycles (like clicks on a delete button) | ||
// it would be great to have a shared context | ||
// actions / values should have { event, arguments, context } | ||
// then there are an aggregate observables that contain data of all objects | ||
// so you can have a SharedAureliaDriver | ||
// Shared.select(TodoItem).actions('destroy') | ||
// actually, with @bindable you could theoretically also bind action triggers | ||
// so maybe it's not necesary to have a shared context after all? | ||
// import * as TheLogManager from 'aurelia-logging' | ||
// export { default as Cycle } from '@cycle/core/lib/index' | ||
// export { Subject, Scheduler, Observable, Observer, Operator, Subscriber, Subscription, Symbol, AsyncSubject, ReplaySubject, BehaviorSubject, ConnectableObservable, Notification, EmptyError, ArgumentOutOfRangeError, ObjectUnsubscribedError, UnsubscriptionError } from 'rxjs/Rx' | ||
const logger = TheLogManager.getLogger('aurelia-cycle') | ||
const logger = LogManager.getLogger('aurelia-cycle-new') | ||
// const logger = TheLogManager.getLogger('aurelia-cycle-new') | ||
export function configure(frameworkConfig) { | ||
const bindingBehaviorInstance = frameworkConfig.container.get(CycleBindingBehavior) | ||
frameworkConfig.aurelia.resources.registerBindingBehavior('cycle', bindingBehaviorInstance) //new CycleBindingBehavior() | ||
export function configure(frameworkConfig: FrameworkConfiguration) { | ||
// const bindingBehaviorInstance = frameworkConfig.container.get(CycleBindingBehavior) | ||
// frameworkConfig.aurelia.resources.registerBindingBehavior('cycle', bindingBehaviorInstance) //new CycleBindingBehavior() | ||
// TODO: investigate: | ||
// frameworkConfig.aurelia.resources.registerViewEngineHooks({ | ||
// beforeCreate: ()=>{ logger.debug('before view create') }, | ||
// afterCreate: ()=>{ logger.debug('after view create') } | ||
// }) | ||
const originalBind:(scope)=>void = View.prototype.bind | ||
@@ -23,3 +42,3 @@ | ||
let sources | ||
// logger.debug('before bind') | ||
if (context && typeof context.cycle == 'function') { | ||
@@ -30,3 +49,3 @@ function getDefaultSources() { | ||
// console.log('sources', context, context.cycleDrivers, scope) | ||
// logger.debug('sources', context, context.cycleDrivers, scope) | ||
sources = context.cycleDrivers | ||
@@ -46,2 +65,3 @@ // logger.debug('starting post-binding for cycle hook', sources, typeof sources, context.constructor.name + 'View', context.constructor.name + 'View' in sources) | ||
originalBind.apply(this, arguments) | ||
// logger.debug('after bind') | ||
@@ -58,27 +78,200 @@ if (sources) { | ||
/* | ||
const originalEnsurePropertiesDefined = HtmlBehaviorResource.prototype._ensurePropertiesDefined | ||
HtmlBehaviorResource.prototype._ensurePropertiesDefined = function _ensurePropertiesDefined(instance: Object, lookup: Object) { | ||
logger.debug('HtmlBehaviorResource', instance, lookup, this, this.properties) | ||
originalEnsurePropertiesDefined.apply(this, arguments) | ||
// const bindingBind: Function = Binding.prototype.bind | ||
// Binding.prototype.bind = function bind(source: Scope) { | ||
// bindingBind.apply(this, arguments) | ||
// console.log('binding', this) | ||
// } | ||
const callScopeConnect: Function = CallScope.prototype.connect | ||
CallScope.prototype.connect = function connect(binding: Binding & any, scope: Scope) { | ||
callScopeConnect.apply(this, arguments) | ||
console.log('connected', binding, scope, this) | ||
// binding.call() | ||
if (this.name == 'cycleValue') { | ||
console.log('we have a cycleValue connect!') | ||
const context = scope.bindingContext | ||
const name = this.args[0].evaluate(scope, binding.lookupFunctions, true) | ||
const observable = getOrCreateObservable(name, context) | ||
observable.subscribe( | ||
(value) => { | ||
// this.updateTarget(value) // update CallScope value | ||
let bindingValue = binding.sourceExpression.evaluate(binding.source, binding.lookupFunctions) | ||
binding.updateTarget(bindingValue) // update the whole binding | ||
}, | ||
(error) => logger.error(`binding error for ${name}`, error), | ||
() => logger.debug(`observable for ${name} complete`) | ||
) | ||
// setInterval(() => { | ||
// let value = binding.sourceExpression.evaluate(binding.source, binding.lookupFunctions) | ||
// binding.updateTarget(value) | ||
// }, 1000) | ||
} | ||
// binding. | ||
// let args = this.args; | ||
// let i = args.length; | ||
// while (i--) { | ||
// args[i].connect(binding, scope); | ||
// } | ||
// todo: consider adding `binding.observeProperty(scope, this.name);` | ||
} | ||
*/ | ||
const callScopeConstructor: Function = CallScope.prototype.constructor | ||
CallScope.prototype.constructor = function() { | ||
callScopeConstructor.apply(this, arguments) | ||
this.isAssignable = true | ||
} | ||
function triggerObservers(name:string, value: ViewValue, context) { | ||
const observers = context.observers.get(name) as Set<Observer<ViewValue>> | ||
if (observers) | ||
observers.forEach(observer => observer.next(value)) // maybe we need to add origin? | ||
else | ||
logger.error(`no observer set exists for ${name} cycle binding`) | ||
} | ||
CallScope.prototype.assign = function assign(scope: Scope, value: any, lookupFunctions: any): any { | ||
// if (!context.cycle) { | ||
const context = getContextFor(this.name, scope, this.ancestor) | ||
if (!context || typeof context.cycle != 'function' || this.name !== 'cycleValue' || this.args.length === 0) { | ||
throw new Error(`Binding expression "${this}" cannot be assigned to.`); | ||
} | ||
// const context = scope.bindingContext | ||
const name = this.args[0].evaluate(scope, lookupFunctions, true) | ||
logger.debug(context, 'will set', name, 'to', value) | ||
triggerObservers(name, value, context) | ||
} | ||
const callScopeEvaluate: Function = CallScope.prototype.evaluate | ||
CallScope.prototype.evaluate = function evaluate(scope: Scope, lookupFunctions, mustEvaluate: boolean) { | ||
const context = getContextFor(this.name, scope, this.ancestor) | ||
if (!context || typeof context.cycle != 'function' || (this.name !== 'cycleValue' && this.name !== 'cycleAction') || this.args.length === 0) { | ||
return callScopeEvaluate.apply(this, arguments) | ||
} | ||
// const context = scope.bindingContext | ||
const name = this.args[0].evaluate(scope, lookupFunctions, true) | ||
if (this.name === 'cycleAction') { | ||
const args = evalList(scope, Array.from(this.args).slice(1), lookupFunctions) | ||
const event = scope.overrideContext.$event | ||
logger.debug(context, 'event trigerred', name, args, event, this) | ||
triggerObservers(name, { event, arguments: args }, context) | ||
// NOTE: if this returns true, it can leave propagation | ||
return | ||
} | ||
logger.debug(context, 'getting value to set in the view', name, this) | ||
// no it's own we shouldn't return anything; | ||
// instead we will use propertyViewSetters directly to set the value of this binding | ||
if (name in context) | ||
return context[name] | ||
// context.aureliaViewValues.get(name) | ||
// 'awesome' | ||
// let args = evalList(scope, this.args, lookupFunctions); | ||
// let func = getFunction(context, this.name, mustEvaluate); | ||
// if (func) { | ||
// return func.apply(context, args); | ||
// } | ||
// return undefined; | ||
} | ||
function getOrCreateObservable(name: string, context, hasValue = true) { | ||
let observable = context.observables.get(name) as Observable<any> & ObservableTypeExtension | ||
if (!observable) { | ||
const observers = new Set<Observer<string>>() | ||
observable = Observable.create(function (observer: Observer<string>) { | ||
// logger.debug('Creating toView binding observable for:', name) | ||
observers.add(observer) | ||
// Any cleanup logic might go here | ||
return function () { | ||
// logger.debug('disposed of toView observable for', name) | ||
observers.delete(observer) | ||
} | ||
}) | ||
if (hasValue) { | ||
observable._cycleType = 'value' | ||
const storeValueCacheSubscription: Subscription = observable.subscribe( | ||
value => context[name] = value | ||
// value => context.aureliaViewValues.set(name, value) | ||
// undefined, | ||
// () => storeValueCacheSubscription.unsubscribe() | ||
) | ||
} else { | ||
observable._cycleType = 'action' | ||
} | ||
context.observables.set(name, observable) | ||
context.observers.set(name, observers) | ||
// storeValueSubscription. | ||
} | ||
return observable | ||
} | ||
CallScope.prototype.bind = function bind(binding: Binding & any, scope: Scope, lookupFunctions) { | ||
const expression = binding.sourceExpression // as Expression & { name:string, ancestor:any, args:Array<Expression>, _unbind:()=>void } | ||
// const name = expression.name // act only if 'cycleValue' | ||
// console.log('binding', binding) | ||
if (expression.name == 'cycleValue' || expression.name == 'cycleAction') { | ||
const context = getContextFor(expression.name, scope, expression.ancestor) | ||
const name = expression.args[0].evaluate(scope, lookupFunctions, true) | ||
// store the update method: | ||
logger.debug('store the updateTarget for', name, context, binding) | ||
// setTimeout(() => binding.updateTarget('ho ho ho'), 2000) | ||
const observable = getOrCreateObservable(name, context, expression.name == 'cycleValue') | ||
// observable.subscribe( | ||
// (value) => binding.updateTarget(value), | ||
// (error) => logger.error(`binding error for ${name}`, error), | ||
// () => logger.debug(`observable for ${name} complete`) | ||
// ) | ||
// const propertyViewSetters = context.propertyViewSetters as Map<string, Function> | ||
// propertyViewSetters.set(name, binding.updateTarget.bind(binding)) | ||
// expression._unbind = () => propertyViewSetters.delete(name) | ||
} | ||
// should we? | ||
// binding.targetObserver = { subscribe(){ }, unsubscribe() { } } | ||
} | ||
CallScope.prototype.unbind = function unbind(binding, scope: Scope) { | ||
const expression = binding.sourceExpression | ||
// const name = expression.name // act only if 'cycleValue' | ||
if (expression.name == 'cycleValue') { | ||
expression._unbind() | ||
// const context = getContextFor(expression.name, scope, expression.ancestor) | ||
// const name = expression.args[0].evaluate(scope, lookupFunctions, true) | ||
// store the update method: | ||
// logger.debug('store the updateTarget for', name, context, binding.updateTarget) | ||
} | ||
// should we? | ||
// binding.targetObserver = { subscribe(){ }, unsubscribe() { } } | ||
} | ||
} | ||
export type PropertyViewSetterMap = Map<string, (value)=>void>; | ||
export type ViewObservable = Observable<string | number>; | ||
export type Action = { event: AnyEvent, arguments: Array<any> }; | ||
export type Value = string | number | ||
export type ViewValue = Action | Value | ||
export type FromViewActionObservable = Observable<Action> & { _aureliaType: 'action' | 'property' }; | ||
export type FromViewValueObservable = ViewObservable & { _aureliaType: 'action' | 'property' }; | ||
// export type ViewObservable = Observable<string | number>; | ||
export type FromViewObservable = FromViewActionObservable | FromViewValueObservable; | ||
export type FromViewObservableMap = Map<string, FromViewObservable>; | ||
export type ObservableTypeExtension = { _cycleType: 'action' | 'value' }; | ||
export type ActionObservable = Observable<Action> & ObservableTypeExtension; | ||
export type ValueObservable = Observable<Value> & ObservableTypeExtension; | ||
// export type ViewObservable = ActionObservable | ValueObservable; | ||
export type ViewObservable = (Observable<Action> | Observable<Value>) & ObservableTypeExtension; | ||
export type ViewObservableMap = Map<string, ViewObservable>; | ||
export type ViewValues = Map<string, string | number>; | ||
// export type ViewObservableMap = Map<string, ViewObservable>; | ||
export type AnyEvent = Event | FocusEvent | GamepadEvent | HashChangeEvent | KeyboardEvent | MessageEvent | MouseEvent | MouseWheelEvent | MSGestureEvent | MSManipulationEvent | MSMediaKeyMessageEvent | MSMediaKeyNeededEvent | MSSiteModeEvent | MutationEvent | NavigationCompletedEvent | NavigationEvent | NavigationEventWithReferrer | OfflineAudioCompletionEvent | PageTransitionEvent | PermissionRequestedEvent | PointerEvent | PopStateEvent | ProgressEvent | ScriptNotifyEvent | StorageEvent | SVGZoomEvent | TextEvent | TouchEvent | TrackEvent | TransitionEvent | UIEvent | UnviewableContentIdentifiedEvent | WebGLContextEvent | WheelEvent; | ||
export type Action = { event: AnyEvent, arguments: Array<any> }; | ||
export type ViewSource = { values: (bindingName: string) => FromViewValueObservable, actions: (bindingName: string) => FromViewActionObservable }; | ||
export type ViewSource = { values: (bindingName: string) => ValueObservable, actions: (bindingName: string) => ActionObservable }; | ||
////////////////////////// | ||
function invokeAureliaBindingSetter(context: any, name: string, value: string) { | ||
const previousValue = context.aureliaViewValues.get(name) | ||
// const previousValue = context.aureliaViewValues.get(name) | ||
const previousValue = context[name] | ||
@@ -93,10 +286,10 @@ if (previousValue !== value) { | ||
const propertyViewSetters: PropertyViewSetterMap = context.propertyViewSetters | ||
// const aureliaToViewObservables: ViewObservables = context.aureliaToViewObservables | ||
const setter = propertyViewSetters.get(name) | ||
if (setter) | ||
setter(value) | ||
else | ||
logger.error(`the binding (${name}) is not a two-way binding and you cannot set it!`) | ||
// const propertyViewSetters: PropertyViewSetterMap = context.propertyViewSetters | ||
const observers = context.observers as Map<string, Observer<string>> | ||
observers.get(name).forEach(observer => observer.next(value)) | ||
// const setter = propertyViewSetters.get(name) | ||
// if (setter) | ||
// setter(value) | ||
// else | ||
// logger.error(`the binding (${name}) is not a two-way binding and you cannot set it!`) | ||
} | ||
@@ -109,12 +302,14 @@ // else { | ||
function getAureliaObservableForBinding(context: any, name: string) { | ||
const aureliaFromViewObservables: FromViewObservableMap = context.aureliaFromViewObservables | ||
const aureliaToViewObservables: ViewObservableMap = context.aureliaToViewObservables | ||
const observables: ViewObservableMap = context.observables | ||
return observables.get(name) | ||
// const aureliaFromViewObservables: FromViewObservableMap = context.aureliaFromViewObservables | ||
// const aureliaToViewObservables: ViewObservableMap = context.aureliaToViewObservables | ||
let fromView = aureliaFromViewObservables.get(name) | ||
let toView = aureliaToViewObservables.get(name) | ||
// let fromView = aureliaFromViewObservables.get(name) | ||
// let toView = aureliaToViewObservables.get(name) | ||
const returnObservable: FromViewObservable = toView && fromView ? Observable.merge<FromViewObservable, FromViewObservable>(fromView, toView) : toView as any || fromView | ||
// const returnObservable: FromViewObservable = toView && fromView ? Observable.merge<FromViewObservable, FromViewObservable>(fromView, toView) : toView as any || fromView | ||
returnObservable._aureliaType = fromView ? fromView._aureliaType : 'property' | ||
return returnObservable | ||
// returnObservable._cycleType = fromView ? fromView._cycleType : 'value' | ||
// return returnObservable | ||
} | ||
@@ -140,4 +335,4 @@ | ||
const observable = getAureliaObservableForBinding(context, bindingName) | ||
if (!observable || observable._aureliaType != 'property') | ||
throw new Error(`Cannot select an unexistent binding ${bindingName}`) | ||
if (!observable || observable._cycleType != 'value') | ||
throw new Error(`Cannot select a non-existent value binding ${bindingName}`) | ||
return observable | ||
@@ -147,4 +342,4 @@ }, | ||
const observable = getAureliaObservableForBinding(context, bindingName) | ||
if (!observable || observable._aureliaType != 'action') | ||
throw new Error(`Cannot select an unexistent binding ${bindingName}`) | ||
if (!observable || observable._cycleType != 'action') | ||
throw new Error(`Cannot select a non-existent action binding ${bindingName}`) | ||
return observable | ||
@@ -159,14 +354,20 @@ }, | ||
// aurelia specific | ||
if (!context.propertyViewSetters) | ||
context.propertyViewSetters = new Map<string, (value)=>void>() | ||
// if (!context.propertyViewSetters) | ||
// context.propertyViewSetters = new Map<string, (value)=>void>() | ||
if (!context.aureliaFromViewObservables) | ||
context.aureliaFromViewObservables = new Map<string, Observable<any>>() | ||
// if (!context.aureliaFromViewObservables) | ||
// context.aureliaFromViewObservables = new Map<string, Observable<any>>() | ||
if (!context.aureliaToViewObservables) | ||
context.aureliaToViewObservables = new Map<string, Observable<any>>() | ||
// if (!context.aureliaToViewObservables) | ||
// context.aureliaToViewObservables = new Map<string, Observable<any>>() | ||
if (!context.aureliaViewValues) | ||
context.aureliaViewValues = new Map<string, string>() | ||
// if (!context.aureliaViewValues) | ||
// context.aureliaViewValues = new Map<string, string>() | ||
if (!context.observables) | ||
context.observables = new Map<string, Observable<any>>() | ||
if (!context.observers) | ||
context.observers = new Map<string, Observer<any>>() | ||
if (!context.cycleStarted || !context.cycleStartedResolve) | ||
@@ -178,184 +379,27 @@ context.cycleStarted = new Promise<void>((resolve) => context.cycleStartedResolve = resolve) | ||
const interceptMethods = ['updateTarget', 'updateSource', 'callSource'] | ||
export class CycleBindingBehavior { | ||
bind(binding, scope, name) { // , param, param... | ||
const context = scope.overrideContext.bindingContext // == Welcome | ||
const expression = binding.sourceExpression.expression | ||
let firstExpression = expression.expression || expression | ||
if (!name) { | ||
let maxNesting = 10 | ||
while (!firstExpression.name && maxNesting--) { | ||
firstExpression = firstExpression.left | ||
} | ||
name = firstExpression.name | ||
} | ||
logger.debug(`Creating Cycle binding for '${name}' via interception`) | ||
// TODO: don't create toView when 'callSource' type | ||
const toViewObservers = new Set<Observer<string>>() | ||
const toViewObservable:Observable<any> = Observable.create(function (observer: Observer<any>) { | ||
// logger.debug('Creating toView binding observable for:', name) | ||
// Yield a single value and complete | ||
toViewObservers.add(observer) | ||
// Any cleanup logic might go here | ||
return function () { | ||
// logger.debug('disposed of toView observable for', name) | ||
toViewObservers.delete(observer) | ||
} | ||
}) | ||
binding.toViewObservable = toViewObservable | ||
binding.toViewObservers = toViewObservers | ||
context.aureliaToViewObservables.set(name, toViewObservable) | ||
let toViewSubscription: Subscription | ||
if (binding['updateTarget']) { | ||
let method = 'updateTarget' | ||
binding[`cycle-intercepted-${method}`] = binding[method] | ||
const updateBindingValueInView = binding[method].bind(binding); | ||
toViewSubscription = toViewObservable.subscribe(value => { | ||
// logger.debug('updating toView', name, value) | ||
updateBindingValueInView(value) | ||
}, error => logger.error(`Error in a toViewObservable binding for ${name}`)) | ||
const toViewObserversNextAll = (value) => { | ||
toViewObservers.forEach(observer => observer.next(value)) | ||
} | ||
// seed default value of the binding | ||
// this shouldn't happen more than once (?) | ||
// update is the "setter" for the View | ||
// binding[method] = toViewObserversNextAll | ||
binding[method] = (value) => { | ||
context.cycleStarted.then(() => { | ||
// don't seed an initial value if it is undefined | ||
if (value !== undefined) { | ||
logger.debug(`an initial value was seeded to the observable: ${name} = '${value}'`) | ||
toViewObserversNextAll(value) | ||
} | ||
}) | ||
// toViewObservers.forEach(observer => observer.next(value)) | ||
} | ||
context.propertyViewSetters.set(name, toViewObserversNextAll) | ||
} | ||
let allChanges = toViewObservable | ||
if (binding['updateSource'] || binding['callSource']) { | ||
let fromViewObservers = new Set<Observer<string|{event; arguments}>>() | ||
const fromViewObservable:Observable<any> = Observable.create(function (observer: Observer<any>) { | ||
// logger.debug('Creating fromView binding observable for:', name) | ||
// Yield a single value and complete | ||
fromViewObservers.add(observer) | ||
// Any cleanup logic might go here | ||
return function () { | ||
// logger.debug('disposed of fromView observable for', name) | ||
fromViewObservers.delete(observer) | ||
} | ||
}) | ||
binding.fromViewObservable = fromViewObservable | ||
binding.fromViewObservers = fromViewObservers | ||
context.aureliaFromViewObservables.set(name, fromViewObservable) | ||
if (binding['updateSource']) { | ||
let method = 'updateSource' | ||
binding[`cycle-intercepted-${method}`] = binding[method]; | ||
// user input - we don't need to change the underlying ViewModel, | ||
// since we don't plan on using it | ||
// | ||
// we seed the value as user input to the observable | ||
binding[method] = (value) => { | ||
// logger.debug('you changed the value of', name, value) | ||
fromViewObservers.forEach(observer => observer.next(value)) | ||
} | ||
fromViewObservable['_aureliaType'] = 'property' | ||
allChanges = Observable.merge(fromViewObservable, toViewObservable) | ||
} | ||
if (binding['callSource']) { | ||
let method = 'callSource' | ||
binding[`cycle-intercepted-${method}`] = binding[method] | ||
// triggers and delegates should be considered user input | ||
const args = firstExpression.args | ||
binding[method] = ($event) => { | ||
let evaluatedArgs = [] | ||
for (let arg of args) { | ||
evaluatedArgs.push(arg.evaluate(binding.source, binding.lookupFunctions, true)) | ||
} | ||
// logger.debug('you invoked a method', name, event, evaluatedArgs) | ||
fromViewObservers.forEach(observer => observer.next({ event, arguments: evaluatedArgs })) | ||
} | ||
fromViewObservable['_aureliaType'] = 'action' | ||
} | ||
} | ||
if (binding['updateSource'] || binding['updateTarget']) { | ||
binding.allChangesObservable = | ||
allChanges.subscribe( | ||
(value) => { | ||
// logger.debug('a value was set', name, value) | ||
context.aureliaViewValues.set(name, value) | ||
}, | ||
(error) => logger.error(error.message), | ||
() => { | ||
logger.debug(`completed allChangesObservable for ${name}`) | ||
binding.allChangesObservable = undefined | ||
} | ||
) | ||
} | ||
} | ||
unbind(binding, scope) { | ||
let i = interceptMethods.length; | ||
while (i--) { | ||
let method = interceptMethods[i]; | ||
if (!binding[method]) { | ||
continue; | ||
} | ||
binding[method] = binding[`cycle-intercepted-${method}`]; | ||
binding[`cycle-intercepted-${method}`] = undefined; | ||
} | ||
if (binding.toViewObservable) { | ||
binding.toViewObservers.forEach(observer => observer.complete()) | ||
binding.toViewObservers = undefined | ||
binding.toViewObservable = undefined | ||
} | ||
if (binding.fromViewObservable) { | ||
binding.fromViewObservers.forEach(observer => observer.complete()) | ||
binding.fromViewObservers = undefined | ||
binding.fromViewObservable = undefined | ||
} | ||
////////////////////////// | ||
// FROM https://github.com/aurelia/binding/blob/master/src/ast.js | ||
var evalListCache = [[],[0],[0,0],[0,0,0],[0,0,0,0],[0,0,0,0,0]]; | ||
/// Evaluate the [list] in context of the [scope]. | ||
function evalList(scope, list, lookupFunctions) { | ||
var length = list.length, | ||
cacheLength, i; | ||
for (cacheLength = evalListCache.length; cacheLength <= length; ++cacheLength) { | ||
evalListCache.push([]); | ||
} | ||
} | ||
var result = evalListCache[length]; | ||
/** | ||
* Decorator: Specifies that Cycle should used in the decoratored ViewModel. | ||
* [NOT USED AT THIS TIME] | ||
*/ | ||
export function cycle(potentialTarget?: any): any { | ||
let deco = function(target) { | ||
console.log('cycle decorator', target) | ||
target.useCycle = true | ||
for (i = 0; i < length; ++i) { | ||
result[i] = list[i].evaluate(scope, lookupFunctions); | ||
} | ||
return potentialTarget ? deco(potentialTarget) : deco; | ||
return result; | ||
} |
Sorry, the diff of this file is not supported yet
76373
1152