更新触发器
JavaFX类没有构造器,其属性也没有“setter”。作为替代物,JavaFX提供了类似SQL的触发器(trigger)来为使用者提供处理数据修改事件的能力。
触发器使用trigger关键字声明。
触发器由头部和代码体构成。头部说明了触发器应用的事件类型。代码体则是在特定事件发生时执行的过程。在代码体中你可以使用任何在操作体中有效的语句。与成员函数/操作类似,在触发器中在代码体内的上下文对象可以通过this关键字访问。
创建触发器
你可以在一个新建对象的上下文中声明一个创建触发器:
import java.lang.System;
class X {
attribute nums: Number*;
}
trigger on new X {
insert [3,4] into this.nums;
}
var x = new X();
System.out.println(x.nums == [3,4]); // prints true
上面的示例中定义了一个在X类的实例被创建时执行的触发器。此触发器完成了对nums属性的初始赋值。
插入触发器
当一个成员被插入到多值属性时,我们可以定义一个插入触发器:
import java.lang.System;
class X {
attribute nums: Number*;
}
trigger on insert num into X.nums {
System.out.println("just inserted into X.nums at position {indexof num}");
}
var x = new X();
insert 12 into x.nums; // prints just inserted 12 into X.nums at position 0
insert 13 into x.nums; // prints just inserted 13 into X.nums at position 1
以上示例代码中,“num”是引用被插入成员的变量(你可以按照自己喜好命名它)。此变量的上下文索引(由indexof操作符返回)与插入点一致。
删除触发器
当一个成员从多值属性中被删除时,我们可以定义一个删除触发器:
import java.lang.System;
class X {
attribute nums: Number*;
}
trigger on delete num from X.nums {
System.out.println("just deleted from X.nums at position {indexof num}");
}
var x = X {
nums: [12, 13]
};
delete x.nums[1]; // prints just deleted 13 from X.nums at position 1
delete x.nums[0]; // prints just deleted 12 from X.nums at position 0
以上示例代码中,“num”是引用被删除成员的变量(你可以按照自己喜好命名它)。此变量的上下文索引(由indexof操作符返回)与删除点一致。
替换触发器
当一个单值的属性值或者多值属性的成员被替换时,我们可以定义一个替换触发器:
import java.lang.System;
class X {
attribute nums: Number*;
attribute num: Number?;
}
trigger on X.nums[oldValue] = newValue {
System.out.println("just replaced with at position {indexof newValue} in X.nums");
}
trigger on X.num[oldValue] = newValue {
System.out.println("X.num: just replaced with ");
}
var x = X {
nums: [12, 13]
num: 100
};
x.nums[1] = 5; // prints just replaced 13 with 5 at position 1 in X.nums
x.num = 3; // prints X.num: just replaced 100 with 3
x.num = null; // prints X.num: just replaced 3 with null
以上示例代码中,“oldValue”和“newValue”是两个变量,它们分别表示对被替换成员的旧值和替换后的新值的引用(你可以按照自己喜好命名)。变量的上下文索引(由indexof操作符返回)与被替换成员的顺序位置一致。