事件是开发中最常用的行为管理方式。通过 on- 前缀,可以将事件的处理绑定到组件的方法上。

提示:在 San 中,无论是 DOM 事件还是组件的自定义事件,都通过 on- 前缀绑定,没有语法区分。

DOM 事件

on- + 事件名 将 DOM 元素的事件绑定到组件方法上。当 DOM 事件触发时,组件方法将被调用,this 指向组件实例。下面的例子中,当按钮被点击时,组件的 submit 方法被调用。

  1. san.defineComponent({
  2. template: '...<button type="button" on-click="submit">submit</button>',
  3. submit: function () {
  4. var title = this.data.get('title');
  5. if (!title) {
  6. return;
  7. }
  8. sendData({title: title});
  9. }
  10. });

绑定事件时,可以指定参数,引用当前渲染环境中的数据。参数可以是任何类型的表达式

  1. <!-- Template -->
  2. <ul>
  3. <li s-for="item, index in todos">
  4. <h3>{{ item.title }}</h3>
  5. <p>{{ item.desc }}</p>
  6. <i class="fa fa-trash-o" on-click="rmTodo(item)"></i>
  7. </li>
  8. </ul>
  1. // Component
  2. san.defineComponent({
  3. rmTodo: function (todo) {
  4. service.rmTodo(todo.id);
  5. this.data.remove('todos', todo);
  6. }
  7. });

指定参数时,$event 是 San 保留的一个特殊变量,指定 $event 将引用到 DOM Event 对象。从而你可以拿到事件触发的 DOM 对象、鼠标事件的鼠标位置等事件信息。

  1. san.defineComponent({
  2. template: '<button type="button" on-click="clicker($event)">click here</button>',
  3. clicker: function (e) {
  4. alert(e.target.tagName); // BUTTON
  5. }
  6. });

自定义事件

在组件上通过 on- 前缀,可以绑定组件的自定义事件。

下面的例子中,MyComponent 为 Label 组件绑定了 done 事件的处理方法。

  1. var MyComponent = san.defineComponent({
  2. components: {
  3. 'ui-label': Label
  4. },
  5. template: '<div><ui-label bind-text="name" on-done="labelDone($event)"></ui-label></div>',
  6. labelDone: function (doneMsg) {
  7. alert(doneMsg);
  8. }
  9. });

San 的组件体系提供了事件功能,Label 直接通过调用 fire 方法就能方便地派发一个事件。

  1. var Label = san.defineComponent({
  2. template: '<template class="ui-label" title="{{text}}">{{text}}</template>',
  3. attached: function () {
  4. this.fire('done', this.data.get('text') + ' done');
  5. }
  6. });

修饰符

capture

版本:>= 3.3.0

在元素的事件声明中使用 capture 修饰符,事件将被绑定到捕获阶段。

  1. var MyComponent = san.defineComponent({
  2. template: ''
  3. + '<div on-click="capture:mainClick">'
  4. + '<button on-click="capture:btnClick">click</button>'
  5. + '</div>',
  6. mainClick: function (title) {
  7. alert('Main');
  8. },
  9. btnClick: function (title) {
  10. alert('Button');
  11. }
  12. });

注意:只有在支持 addEventListener 的浏览器环境支持此功能,老旧 IE 上使用 capture 修饰符将没有效果。

native

版本:>= 3.3.0

在组件的事件声明中使用 native 修饰符,事件将被绑定到组件根元素的 DOM 事件。

  1. var Button = san.defineComponent({
  2. template: '<a class="my-button"><slot/></a>'
  3. });
  4. var MyComponent = san.defineComponent({
  5. components: {
  6. 'ui-button': Button
  7. },
  8. template: '<div><ui-button on-click="native:clicker(title)">{{title}}</ui-button></div>',
  9. clicker: function (title) {
  10. alert(title);
  11. }
  12. });

有时候组件封装了一些基础结构和样式,同时希望点击、触摸等 DOM 事件由外部使用方处理。如果组件需要 fire 每个根元素 DOM 事件是很麻烦并且难以维护的。native 修饰符解决了这个问题。