控件基础知识

Tabris.js app的UI界面用原生控件构成,并用JavaScript对象来描述。有各种不同的控件可以使用,比如ButtonTextViewScrollView。每个控件类都是Widget的子类, Widget类提供了共通方法来获取属性、设置属性、事件监听以及向父控件添加控件。大多数方法都返回控件本身,便于链式调用。

创建原生控件

每个控件类都接受一个具有初始值的对象来创建原生控件。下面展示了如何用 Tabris.js 创建并初始化控件:

  1. let button = new Button({
  2. left: 10,
  3. top: 10,
  4. text: 'OK'
  5. });

如果你更喜欢声明式UI,你也可以JSX 来创建控件。当你 生成一个 TypeScript 项目时,JSX的支持已经配置好了。

控件属性

每个原生控件都支持一组属性(比如 text 或color)。这些属性可读并且可以直接覆写,或者使用控件的get()set() 方法。

  1. widget.text = 'Hello World';
  2. let text = widget.text;

get()set() 的例子:

  1. widget.set('text', 'Hello World');
  2. let text = widget.get('text');

和构造函数一样,也可以一次设置多个属性:

  1. button.set({
  2. text: 'OK',
  3. background: 'blue'
  4. });

当设置非法值时(比如错误的值类型),如果可以的话,设置的值会被转换,否则会被忽略并在控制台输出警告。set() 方法也会输出警告来说明不支持的属性。

事件

控件可以监听事件,比如交互或属性改变。事件监听可以用 on()once()方法添加,并用off()移除。

示例:

  1. function selectionHandler(event) {
  2. console.log('Button ' + event.target.text + ' selected!');
  3. };
  4. button.on('select', selectionHandler);

监听函数被调用时,会将一个包含多个属性的事件对象作为其参数,属性内容视不同的事件类型而定。但所有的事件都有下面的共通属性:

  • type: 事件类型
  • target: 接收事件的控件
  • timeStamp: 事件创建的时间,用毫秒表示
:point_right: 事件类形是大小写敏感的。

一个上下文对象可以作为on()方法的第三个参数。然后这个对象可以在监听函数中用this访问。

  1. function selectionHandler() {
  2. console.log(this.foo);
  3. };
  4. button.on('select', selectionHandler, {foo: 'Hello World'});

once()方法和on() 一样,但它在触发事件后会移除事件监听。

使用off()方法移除事件监听。

Change事件

全部控件都支持属性改变事件,当属性改变时该事件会被触发。全部change事件都以 [propertyName]Changed 命名并且提供了一个ChangeEvent

除了共通的事件属性外,change 事件包含一个value属性,其值为改变属性的当前值。

示例:

  1. new TextInput().on('textChanged', (event) => {
  2. console.log('The text has changed to: ' + event.value);
  3. });

使用 ES6 解构语法作为事件参数,通常比较方便,解构语法可以用事件属性来作为变量名:

  1. checkBox.on('selectionChanged', ({target, value: checked}) => {
  2. target.text = checked ? 'checked' : 'unchecked';
  3. });

动画

所有控件都有animate(properties, options)方法。它接受一个要进行动画的属性组成的对象(类似于 set 方法),以及动画本身需要的一组配置作为参数。 动画开始时,所有动画属性都会被设置为目标值。因此,调用 get 方法只会返回动画的初始值或者目标值。 只有 transformopacity 属性才可以做动画。

animate 方法会返回一个 Promise 对象,并在动画完成后 resolve。如果动画中止,比如清除控件,promise 会被 rejecte。

示例:

  1. label.animate({
  2. opacity: 0,
  3. transform: {
  4. translationX: 200,
  5. scaleX: 0.1
  6. }
  7. }, {
  8. duration: 1000,
  9. easing: 'ease-out'
  10. }).then(() => label.dispose());

控件树

设置父控件

控件需要一个父控件使其可见。容器视图(ui.contentView)是所有控件的顶级父控件。可以使用append()appendTo()方法将控件添加到对应控件的层次结构中。

示例:

  1. let button = new Button({
  2. text: 'OK',
  3. ...
  4. }).appendTo(parent);

如果控件已经有一个父控件了,它会从当前的父控件中删除然后添加到新的父控件中。在添加控件的父控件中,addChild 事件会被触发。

也可以使用append()一次添加多个控件到父控件:

  1. page.append(okButton, cancelButton);

遍历

参考:Selector API

parent 方法返回控件当前的父控件, children 方法返回子控件。

示例:

  1. let parent = widget.parent();
  2. let firstChild = parent.children()[0];
  3. let lastChild = parent.children().last();

子控件结果列表是一个类数组的WidgetCollection对象。

清除控件

dispose 会清除控件以及其所有子控件。它会在其父控件上触发removeChild事件,并在其自身上触发dispose事件。

示例:

  1. button.on('dispose', () => console.log('Button disposed!'));
  2. button.dispose();

在清除控件后,除了isDisposed()之外的控件方法都不会生效, 如果控件已经被清除了,isDisposed()返回true,否则返回false

原文:

https://youjingyu.github.io/Tabris-Documention/?folderName=guide&pageName=widget-basics.html