aurelia-templating-resources
Version:
A standard set of behaviors, converters and other resources for use with the Aurelia templating library.
57 lines (51 loc) • 1.68 kB
text/typescript
import {bindingBehavior} from 'aurelia-binding';
import {BindingSignaler} from './binding-signaler';
('signal')
export class SignalBindingBehavior {
/**@internal */
static inject() { return [BindingSignaler]; }
signals;
constructor(bindingSignaler) {
this.signals = bindingSignaler.signals;
}
bind(binding, source, ...names) {
if (!binding.updateTarget) {
throw new Error('Only property bindings and string interpolation bindings can be signaled. Trigger, delegate and call bindings cannot be signaled.');
}
let signals = this.signals;
if (names.length === 1) {
let name = names[0];
let bindings = signals[name] || (signals[name] = []);
bindings.push(binding);
binding.signalName = name;
} else if (names.length > 1) {
let i = names.length;
while (i--) {
let name = names[i];
let bindings = signals[name] || (signals[name] = []);
bindings.push(binding);
}
binding.signalName = names;
} else {
throw new Error('Signal name is required.');
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
unbind(binding, source) {
let signals = this.signals;
let name = binding.signalName;
binding.signalName = null;
if (Array.isArray(name)) {
let names = name;
let i = names.length;
while (i--) {
let n = names[i];
let bindings = signals[n];
bindings.splice(bindings.indexOf(binding), 1);
}
} else {
let bindings = signals[name];
bindings.splice(bindings.indexOf(binding), 1);
}
}
}