【问题标题】:Angular $broadcast issueAngular $broadcast 问题
【发布时间】:2016-09-22 09:08:57
【问题描述】:

假设我有两个页面,页面 A 和页面 B,它们分别具有控制器 A 和控制器 B。我先到A页,做一个操作,调用$broadcast发送一个对象:

$rootScope.$broadcast('payData', obj)

我想在控制器B中接收这个广播,但是由于我没有去到页面B,所以控制器B的构造函数没有初始化。由于我尝试在控制器 B 的构造函数中接收此消息,因此它从未收到该消息。

export default class ControllerB{
    constructor($scope, $rootScope){
        this.scope = $scope;
        this.rootScope = $rootScope

        $rootScope.$on('payData', (event, obj) => {
            console.log('broadcastPayData receive obj:', obj);
        })
    }
    //some other cool staff
}

知道如何解决这个问题吗?谢谢。

【问题讨论】:

  • 您应该将payData 存储在服务中。如果控制器不会同时处于活动状态(并且它们通常非常脆弱),则使用事件将不起作用。
  • @JoeClay,聪明,好主意!谢谢

标签: angularjs broadcast


【解决方案1】:

如果控制器 B 尚不存在,将对象保存到 rootScope 并且 B 将在加载后访问它是有意义的:

$rootScope.payData = obj

然后在你的控制器B中使用它

export default class ControllerB{
    constructor($scope, $rootScope){
        this.scope = $scope;
        this.rootScope = $rootScope

        console.log($rootScope.payData);
    }
    //some other cool staff
}

如果$rootScope.payData 会随时间变化,您也可以观看它。

【讨论】:

  • 从长远来看,使用$rootScope 在控制器之间共享数据往往很难维护。这就是为什么 Angular 有服务 - 包含应该在应用程序周围共享的逻辑/数据。
  • @JoeClay 当然,使用服务是个好主意
猜你喜欢
  • 1970-01-01
  • 2016-03-07
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多