资讯专栏INFORMATION COLUMN

broadcast.js

dreamans / 2201人阅读

摘要:机制跨小程序页面的事件注册,派发,广播机制。代码实现通过调用注册事件。通常我们需要特意绑定然后才能使用绑定方式推荐使用

机制:

跨小程序页面的事件注册,派发,广播机制。

代码实现

</>复制代码

  1. var broadcast = {
  2. // 通过调用 broadcast.on 注册事件。其他页面都可以通过调用 broadcast.fire 触发该事件
  3. // 参数说明:如果 isUniq 为 true,该注册事件将唯一存在;如果值为 false或者没有传值,每注册一个事件都将会被存储下来
  4. on: function (name, fn, isUniq) {
  5. this._on(name, fn, isUniq, false)
  6. },
  7. // 通过调用 broadcast.once 注册的事件,在触发一次之后就会被销毁
  8. once: function (name, fn, isUniq) {
  9. this._on(name, fn, isUniq, true)
  10. },
  11. _on: function (name, fn, isUniq, once) {
  12. var eventData
  13. eventData = broadcast.data
  14. var fnObj = {
  15. fn: fn,
  16. once: once
  17. }
  18. if (!isUniq && eventData.hasOwnProperty(name)) {
  19. eventData[name].push(fnObj)
  20. } else {
  21. eventData[name] = [fnObj]
  22. }
  23. return this
  24. },
  25. // 触发事件
  26. // 参数说明:name 表示事件名,data 表示传递给事件的参数
  27. fire: function (name, data, thisArg) {
  28. console.log("[broadcast fire]: " + name, data)
  29. var fn, fnList, i, len
  30. thisArg = thisArg || null
  31. fnList = broadcast.data[name] || []
  32. if (fnList.length) {
  33. for (i = 0, len = fnList.length; i < len; i++) {
  34. fn = fnList[i].fn
  35. fn.apply(thisArg, [data, name])
  36. if (fnList[i].once) {
  37. fnList.splice(i, 1)
  38. i--
  39. len--
  40. }
  41. }
  42. }
  43. return this
  44. },
  45. data: {}
  46. }
  47. module.exports = broadcast

</>复制代码

  1. 业务上的应用举例

1 app.js 里面注册一个监听登陆页面登录成功的事件

步骤如下:

注册一个监听登录成功的事件

</>复制代码

  1. // 引入 broadcast
  2. const {
  3. broadcast
  4. } = require("utils/util")
  5. // 注册一个监听登录成功的事件
  6. // 在login页面执行
  7. broadcast.on("login_success", function () {
  8. wx.redirectTo({
  9. url: `/pages/${name}/index`
  10. })
  11. })

在 login 页面登录成功后,触发该事件

</>复制代码

  1. // 引入 broadcast
  2. var {
  3. broadcast
  4. } = require("../../utils/util")
  5. // 触发事件 login_success
  6. broadcast.fire("login_success")

2 在商品报损页注册一个监听报损商品 code 的事件

这个例子主要体现了使用 broadcast.fire 进行传参的功能

</>复制代码

  1. // 引入 broadcast
  2. var {
  3. broadcast
  4. } = require("../../utils/util")
  5. // 触发事件 setBrokenBikeCode
  6. // "bikeid": "0100010010"
  7. broadcast.fire("setBrokenBikeCode", "0100010010")

</>复制代码

  1. // 引入 broadcast
  2. var {
  3. broadcast
  4. } = require("../../utils/util")
  5. ...
  6. function next (bikecode) {
  7. that.setData({
  8. bikecode
  9. })
  10. }
  11. ...
  12. // 注册事件 setBrokenBikeCode
  13. broadcast.on("setBrokenBikeCode", (bikecode) => {
  14. next(bikecode)
  15. })

3 适当的时候使用 broadcast.on 的时候需要绑定 this 值

绑定方式1:

</>复制代码

  1. var that = this
  2. broadcast.on("showRiding", function() {
  3. console.log(this) // 值为null
  4. that.showRiding()
  5. })

原因:如上代码可见,在 broadcast.on 里面打印出的 this 值为 null,在这个函数体内 this 指向不明确所以值为 null。通常我们需要特意绑定 this, 然后才能使用

绑定方式2:

推荐使用

</>复制代码

  1. broadcast.on("showRiding", function() {
  2. this.showRiding()
  3. }.bind(this))

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96525.html

相关文章

  • 原生js写一个无缝轮播图插件(支持vue)

    摘要:轮播图插件前言写这个插件的原因前段时间准备用加上网易云的接口,模拟网易云音乐移动端。目前主要实现了无缝轮播,自动播放,端左右按钮点击切换,移动端手势滑动切换。 轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端。因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使用UI组件。在轮播图部分,...

    MSchumi 评论0 收藏0
  • 原生js写一个无缝轮播图插件(支持vue)

    摘要:轮播图插件前言写这个插件的原因前段时间准备用加上网易云的接口,模拟网易云音乐移动端。目前主要实现了无缝轮播,自动播放,端左右按钮点击切换,移动端手势滑动切换。 轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端。因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使用UI组件。在轮播图部分,...

    hatlonely 评论0 收藏0
  • 原生js写一个无缝轮播图插件(支持vue)

    摘要:轮播图插件前言写这个插件的原因前段时间准备用加上网易云的接口,模拟网易云音乐移动端。目前主要实现了无缝轮播,自动播放,端左右按钮点击切换,移动端手势滑动切换。 轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端。因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使用UI组件。在轮播图部分,...

    褰辩话 评论0 收藏0
  • 我推荐的一些前端开发工具

    摘要:性能卓越的模板引擎简洁的模版语法,简单的,关键还能前后端共用模板,简直就是前端开发利器。是由阿里巴巴部门推出的矢量图标管理网站。是一个简单的设备检测工具。 artTemplate 性能卓越的 js 模板引擎 简洁的模版语法,简单的API,关键还能前后端(Nodejs)共用模板,简直就是前端开发利器。今天有个想法,把artTemplate封装下,模版render后给input等注册几个事...

    nodejh 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<