broadcast.js 事件廣播

機(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))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.幾種基本數(shù)據(jù)類型?復(fù)雜數(shù)據(jù)類型?值類型和引用數(shù)據(jù)類型?堆棧數(shù)據(jù)結(jié)構(gòu)? 基本數(shù)據(jù)類型:Undefined、Nul...
    極樂君閱讀 5,878評(píng)論 0 106
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,665評(píng)論 1 32
  • 2017.02.22 可以練習(xí),每當(dāng)這個(gè)時(shí)候,腦袋就犯困,我這腦袋真是神奇呀,一說讓你做事情,你就犯困,你可不要太...
    Carden閱讀 1,490評(píng)論 0 1
  • 三個(gè)小故事,簡(jiǎn)單明了的告訴我們有效溝通的重要性,而何為有效溝通?在日常工作生活中,我們?cè)撊绾芜\(yùn)用“好好說話”、“學(xué)...
    周筠桐閱讀 316評(píng)論 2 1
  • 也有四五個(gè)月了,煩也是有個(gè)極限的了,希望新的環(huán)境能夠收獲更多。自己努力加油,多學(xué)習(xí)吧!努力!
    聶一一閱讀 169評(píng)論 0 0

友情鏈接更多精彩內(nèi)容