UNPKG

1.68 kBPlain TextView Raw
1import {bindingBehavior} from 'aurelia-binding';
2import {BindingSignaler} from './binding-signaler';
3
4@bindingBehavior('signal')
5export class SignalBindingBehavior {
6
7 /**@internal */
8 static inject() { return [BindingSignaler]; }
9 signals;
10
11 constructor(bindingSignaler) {
12 this.signals = bindingSignaler.signals;
13 }
14
15 bind(binding, source, ...names) {
16 if (!binding.updateTarget) {
17 throw new Error('Only property bindings and string interpolation bindings can be signaled. Trigger, delegate and call bindings cannot be signaled.');
18 }
19 let signals = this.signals;
20 if (names.length === 1) {
21 let name = names[0];
22 let bindings = signals[name] || (signals[name] = []);
23 bindings.push(binding);
24 binding.signalName = name;
25 } else if (names.length > 1) {
26 let i = names.length;
27 while (i--) {
28 let name = names[i];
29 let bindings = signals[name] || (signals[name] = []);
30 bindings.push(binding);
31 }
32 binding.signalName = names;
33 } else {
34 throw new Error('Signal name is required.');
35 }
36 }
37
38 // eslint-disable-next-line @typescript-eslint/no-unused-vars
39 unbind(binding, source) {
40 let signals = this.signals;
41 let name = binding.signalName;
42 binding.signalName = null;
43 if (Array.isArray(name)) {
44 let names = name;
45 let i = names.length;
46 while (i--) {
47 let n = names[i];
48 let bindings = signals[n];
49 bindings.splice(bindings.indexOf(binding), 1);
50 }
51 } else {
52 let bindings = signals[name];
53 bindings.splice(bindings.indexOf(binding), 1);
54 }
55 }
56}