事件
大部分使用類別/建構函式建置的 Framework7 元件(包括 Framework7 類別本身)都具有事件發射器 API。
它讓我們可以輕鬆發射和處理各種事件,包括元件之間的事件。
參數中的事件處理常式
使用 API 建立應用程式實例或任何其他元件時,可以在 on
參數中傳遞應用程式/元件初始化的事件處理常式
var app = new Framework7({
...
on: {
// each object key means same name event handler
pageInit: function (page) {
// do something on page init
},
popupOpen: function (popup) {
// do something on popup open
},
},
});
var popup = app.popup.create({
...
on: {
open: function (popup) {
// do something on popup open
}
}
})
事件方法
也可以使用下列實例方法新增/移除事件處理常式
[實例].on(事件, 處理常式) | 新增事件處理常式 |
[實例].once(事件, 處理常式) | 新增事件處理常式,該處理常式在觸發後將被移除 |
[實例].off(事件, 處理常式) | 移除指定事件的事件處理常式 |
[實例].off(事件) | 移除指定事件的所有處理常式 |
[實例].emit(事件, ...args) | 在實例上觸發事件 |
新增事件處理常式
var app = new Framework7({/*...*/});
var popup = app.popup.create({/*...*/});
app.on('pageInit', function (page) {
// do something on page init
});
app.on('popupClose', function (popup) {
// do something on popup close
});
popup.on('open', function (popup) {
// do something on popup open
});
// Once handler, will work only once
popup.once('close', function (popup) {
// do something on popup close
});
新增多個處理常式
我們可以在第一個參數中傳遞多個事件,並以空格分隔
app.on('popupOpen popupClose', function (popup) {
// do something on popupOpen and popupClose
});
移除事件處理常式
可以移除具名稱的函式處理常式
function onTabShow() {
// do something on tab show
}
// add handler
app.on('tabShow', onTabShow);
// later remove tabShow handler:
app.off('tabShow', onTabShow);
移除所有處理常式
如果我們沒有將第二個處理常式引數傳遞給 .off
方法,則我們將移除為此事件分配的所有處理常式
// Remove all tabShow handlers
app.off('tabShow');
發射事件
當然,我們可以發射事件和我們可能需要的任何自訂事件
app.on('myCustomEvent', function (a, b) {
console.log(a); // -> 'foo'
console.log(b); // -> 'bar'
});
app.emit('myCustomEvent', 'foo', 'bar');
事件委派
在元件上發射的事件也會委派給應用程式實例
app.on('something', function () {/*...*/});
popup.on('something', function () {/*...*/});
popup.emit('something'); // will trigger "something" event assigned to both app and popup instances
如果這不是您想要的,則可以在元件上發射所謂的本地事件。在這種情況下,我們需要使用 local::
為事件名稱加上前綴
app.on('something', function () {/*...*/});
popup.on('something', function () {/*...*/});
popup.emit('local::something'); // will only trigger "something" event assigned to popup instance above
事件處理常式內容
事件處理常式內容(this
)將始終指向分配它的實例
app.on('popupOpen', function () {
console.log(this); // -> app instance
});
popup.on('popupOpen', function () {
console.log(this); // -> popup instance
});
事件匯流排
Framework7 類別上的目前事件發射器 API 也非常有用,可以用於為應用程式元件和模組之間的通訊建立自訂事件。
此外,還有一個額外的輔助類別,設計為僅用於事件匯流排,而不是淹沒主應用程式或某些元件實例。
要建立新的事件匯流排,我們需要呼叫 new Framework7.Events()
// Create custom events bus
var myEvents = new Framework7.Events();
// handle event
myEvents.on('some-event', function () {
// do something when 'some-event' fired
})
// emit event
myEvents.emit('some-event');
// Create another event bus
const notificationEvents = new Framework7.Events();
notificationEvents.on('notificationReceived', function (notification) {
// do something with notification
})
// somewhere in the app send notification
notificationEvents.emit('notificationReceived', {
title: 'New message',
from: 'John Doe',
});