機(jī)制:
跨小程序頁面的事件注冊(cè),派發(fā),廣播機(jī)制。
代碼實(shí)現(xiàn)
var broadcast = {
// 通過調(diào)用 broadcast.on 注冊(cè)事件。其他頁面都可以通過調(diào)用 broadcast.fire 觸發(fā)該事件
// 參數(shù)說明:如果 isUniq 為 true,該注冊(cè)事件將唯一存在;如果值為 false或者沒有傳值,每注冊(cè)一個(gè)事件都將會(huì)被存儲(chǔ)下來
on: function (name, fn, isUniq) {
this._on(name, fn, isUniq, false)
},
// 通過調(diào)用 broadcast.once 注冊(cè)的事件,在觸發(fā)一次之后就會(huì)被銷毀
once: function (name, fn, isUniq) {
this._on(name, fn, isUniq, true)
},
_on: function (name, fn, isUniq, once) {
var eventData
eventData = broadcast.data
var fnObj = {
fn: fn,
once: once
}
if (!isUniq && eventData.hasOwnProperty(name)) {
eventData[name].push(fnObj)
} else {
eventData[name] = [fnObj]
}
return this
},
// 觸發(fā)事件
// 參數(shù)說明:name 表示事件名,data 表示傳遞給事件的參數(shù)
fire: function (name, data, thisArg) {
console.log('[broadcast fire]: ' + name, data)
var fn, fnList, i, len
thisArg = thisArg || null
fnList = broadcast.data[name] || []
if (fnList.length) {
for (i = 0, len = fnList.length; i < len; i++) {
fn = fnList[i].fn
fn.apply(thisArg, [data, name])
if (fnList[i].once) {
fnList.splice(i, 1)
i--
len--
}
}
}
return this
},
data: {}
}
module.exports = broadcast
業(yè)務(wù)上的應(yīng)用舉例
1 app.js 里面注冊(cè)一個(gè)監(jiān)聽登陸頁面登錄成功的事件
步驟如下:
注冊(cè)一個(gè)監(jiān)聽登錄成功的事件
const {
broadcast
} = require('utils/util')
// 注冊(cè)一個(gè)監(jiān)聽登錄成功的事件
// 在login頁面執(zhí)行
broadcast.on('login_success', function () {
wx.redirectTo({
url: `/pages/${name}/index`
})
})
在 login 頁面登錄成功后,觸發(fā)該事件
var {
broadcast
} = require('../../utils/util')
// 觸發(fā)事件 login_success
broadcast.fire('login_success')
2 在商品報(bào)損頁注冊(cè)一個(gè)監(jiān)聽報(bào)損商品 code 的事件
這個(gè)例子主要體現(xiàn)了使用 broadcast.fire 進(jìn)行傳參的功能
var {
broadcast
} = require('../../utils/util')
// 觸發(fā)事件 setBrokenBikeCode
// "bikeid": "0100010010"
broadcast.fire('setBrokenBikeCode', '0100010010')
// 引入 broadcast
var {
broadcast
} = require('../../utils/util')
...
function next (bikecode) {
that.setData({
bikecode
})
}
...
// 注冊(cè)事件 setBrokenBikeCode
broadcast.on('setBrokenBikeCode', (bikecode) => {
next(bikecode)
})
3 適當(dāng)?shù)臅r(shí)候使用 broadcast.on 的時(shí)候需要綁定 this 值
var that = this
broadcast.on('showRiding', function() {
console.log(this) // 值為null
that.showRiding()
})
原因:如上代碼可見,在 broadcast.on 里面打印出的 this 值為 null,在這個(gè)函數(shù)體內(nèi) this 指向不明確所以值為 null。通常我們需要特意綁定 this, 然后才能使用
綁定方式2:
推薦使用
broadcast.on('showRiding', function() {
this.showRiding()
}.bind(this))